我目前正在编写一个模板,该模板根据输入的类别而有所不同。
我希望将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

09-06 07:10