有没有办法测试std::is_base_of
何时A
是模板类?
templateclass A {}; template class B : public A {};
我想静态地测试类似的东西,std::is_base_of>
意思B
是从任何专业化中衍生出来的A
.(为了使它更通用,让我们说我们不知道B
专门的方式A
,即B
解决的一种方法是从(非模板)类派生A C
,然后检查std::is_base_of
.但还有另一种方法吗?
您可以执行以下操作:
template class C, typename...Ts> std::true_type is_base_of_template_impl(const C*); template class C> std::false_type is_base_of_template_impl(...); template class C> using is_base_of_template = decltype(is_base_of_template_impl (std::declval ()));
现场演示
但是会因多重继承或私有继承而失败A
.
使用Visual Studio 2017,当基类模板具有多个模板参数时,这将失败,并且无法推断 Ts...
演示
VS Bug报告
重构解决了VS的问题.
template < templateclass base,typename derived> struct is_base_of_template_impl { template static constexpr std::true_type test(const base *); static constexpr std::false_type test(...); using type = decltype(test(std::declval ())); }; template < template class base,typename derived> using is_base_of_template = typename is_base_of_template_impl ::type;
现场演示