C++ 用于检测非继承typedef的Trait
如果C++ 用于检测非继承typedef的Trait,c++,typedef,typetraits,C++,Typedef,Typetraits,如果struct具有未继承的typedef,是否有方法检测 以下代码在C #include <iostream> struct A { }; struct B : public A { typedef A Base; }; struct C : public B {}; template<typename T> struct to_void { typedef void type; }; template <typename T, typename d
struct
具有未继承的typedef
,是否有方法检测
以下代码在C
#include <iostream>
struct A { };
struct B : public A { typedef A Base; };
struct C : public B {};
template<typename T>
struct to_void
{
typedef void type;
};
template <typename T, typename dummy = void>
struct has_base_typedef : std::false_type {};
template <typename T>
struct has_base_typedef<T, typename to_void<typename T::Base>::type> : std::true_type {};
int main()
{
std::cout << has_base_typedef<A>::value;
std::cout << has_base_typedef<B>::value;
std::cout << has_base_typedef<C>::value;
}
#包括
结构A{};
结构B:公共A{typedef A Base;};
结构C:公共B{};
模板
结构到_void
{
typedef-void型;
};
模板
结构具有_base_typedef:std::false_type{};
模板
结构具有_base_typedef:std::true_type{};
int main()
{
std::cout基本上,您想要阻止基
别名隐式传播到派生类,我认为这是不可能的。我能想到的实现接近您想要的东西的唯一方法是:
struct C;
struct A {};
struct B : public A {
using Base = A;
using Derived = C;
};
struct C : public B { };
template<typename T>
struct to_void {
typedef void type;
};
template <typename T, typename dummy = void>
struct has_base_typedef : std::false_type {};
template <typename T>
struct has_base_typedef<T, std::enable_if_t<!std::is_same<typename T::Derived, T>::value,
typename to_void<typename T::Base>::type>> : std::true_type {};
structc;
结构A{};
结构B:公共A{
使用Base=A;
使用派生=C;
};
结构C:公共B{};
模板
结构到_void{
typedef-void型;
};
模板
结构具有_base_typedef:std::false_type{};
模板
结构具有_base_typedef::type>>:std::true_type{};
OP expected010
它得到了:-)谢谢你的回答,不幸的是,这不是我要寻找的一般方法。派生类可以不止一个(必须使用类型列表),并且struct可以在库中,并且在创建新的派生类时不应该(不能)修改。。。