我目前正在编写一个模板,该模板根据输入的类别而有所不同。
我希望将3种情况添加到我的traits类中。
我该如何处理?进行A.和C.或B.和C.都很简单,但是我不确定如何获得全部3。
编辑
一个例子可能会使它更容易理解。
class Foo
{
typedef foo_tag type_category;
}
class Bar;
my_traits<Foo>::type(); // makes a foo_tag
my_traits<Bar>::type(); // makes a regular_tag
my_traits<std::list<Baz>>::type(); // makes a special_tag because I want special list proce
唱歌。 最佳答案
脚手架可能看起来像这样:
template <typename T>
struct MyTrait
{
typedef typename MyHelper<T, CheckForType<T>::value>::type tag;
};
template <typename T>
struct MyTrait<std::list<T>>
{
typedef special_tag tag;
};
我们需要帮助者:
template <typename T, bool>
struct MyHelper
{
typedef regular_tag tag;
};
template <typename T>
struct MyHelper<T, true>
{
typedef typename T::type_category tag;
};
现在我们需要的是一个类型特征来检查成员的typedef:
template<typename T>
struct CheckForType
{
private:
typedef char yes;
typedef struct { char array[2]; } no;
template<typename C> static yes test(typename C::type_category*);
template<typename C> static no test(...);
public:
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
用法:
MyTrait<Foo>::tag