Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查实现了哪些基类_C++_Templates_Inheritance - Fatal编程技术网

C++ 检查实现了哪些基类

C++ 检查实现了哪些基类,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<

我有两个模板类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<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);