C++ 检查实现了哪些基类
我有两个模板类A和BC++ 检查实现了哪些基类,c++,templates,inheritance,C++,Templates,Inheritance,我有两个模板类A和B template <typename T> class A { /* ... */ }; template <typename T> class B { /* ... */ }; 依赖于过载解决方案的老把戏也应该在这里起作用: template<template<typename...> class TT, class T> struct is_specialization_base_of { template<
template <typename T> class A { /* ... */ };
template <typename T> class B { /* ... */ };
依赖于过载解决方案的老把戏也应该在这里起作用:
template<template<typename...> class TT, class T>
struct is_specialization_base_of {
template<typename... Args>
static constexpr std::true_type check(TT<Args...> const&);
static constexpr std::false_type check(...);
static constexpr bool value = decltype(check(std::declval<T>()))::value;
};
我将把把这个特性插入模板函数的练习留给您。我建议将那些
if
转换成if constexpr
来增加一些好处。你不能检查t是否从任何A或B继承。你可能正在寻找吗?替代方法:让所有A和B继承自类C,并检查继承自Calso,一些编译器使用\u is\u base\u of(base,Drived)
要检查继承,为什么不能直接使用模板void foo(const A&obj)
呢?例如,结构C4:A,A{}代码>@xskxzr-是的,歧义会杀死它。但是,std::is_base_of
非常有用,因为它允许作弊。C++03中的IIRC相似特性与MI有相同的问题。
template<template<typename...> class TT, class T>
struct specialization_base_of {
template<typename... Args>
static constexpr TT<Args...> checkVal(TT<Args...> const&);
static constexpr void checkVal(...);
template<typename... Args>
static constexpr TT<Args...>& checkRef(TT<Args...> const&);
static constexpr void checkRef(...);
template<typename... Args>
static constexpr TT<Args...> const& checkCref(TT<Args...> const&);
static constexpr void checkCref(...);
template<typename... Args>
static constexpr TT<Args...>* checkPtr(TT<Args...> const&);
static constexpr void checkPtr(...);
using value_type = decltype(checkVal(std::declval<T>()));
using ref_type = decltype(checkRef(std::declval<T>()));
using cref_type = decltype(checkCref(std::declval<T>()));
using ptr_type = decltype(checkPtr(std::declval<T>()));
};
template<template<typename...> class TT, class T>
struct is_specialization_base_of {
template<typename... Args>
static constexpr std::true_type check(TT<Args...> const&);
static constexpr std::false_type check(...);
static constexpr bool value = decltype(check(std::declval<T>()))::value;
};
struct C1 : A<int> {};
struct C2 : B<int> {};
struct C3 : A<int>, B<char> {};
static_assert(is_specialization_base_of<A, C1>::value);
static_assert(!is_specialization_base_of<B, C1>::value);
static_assert(!is_specialization_base_of<A, C2>::value);
static_assert(is_specialization_base_of<B, C2>::value);
static_assert(is_specialization_base_of<A, C3>::value);
static_assert(is_specialization_base_of<B, C3>::value);