部分特化模板作为trait成员类型

partially specialized template as a trait member type

本文关键字:trait 成员 成员类 类型      更新时间:2023-10-16

我想从trait类中选择一个模板,如下所示:

template<typename T>
class JobTypeA { };
template<typename T>
class JobTypeB { };
template<typename T>
class JobTraits
{
    /* nothing */
};
class A { };
template<>
class JobTraits<A>
{
    typedef JobTypeA Type;
};
class B {};
template<>
class JobTraits<B>
{
    typedef JobTypeB Type;
};
class JobTarget1 { };
class JobTarget2 { };
template<typename T, typename U>
class JobUser
{
public:
    typedef typename JobTraits<T>::Type<U> JobType;
    void doSomething (void)
    {
        JobType j;
        /*... */
    }
};
int
main (void)
{
    JobUser<B, JobTarget1> j;
}

由于特化trait类中的"不完整类型的typedef",上面的代码无法编译。我得到了这个工作使用'别名模板'在std=c++11与g++ 4.7.2。但是VS2010还不支持它。如果没有"别名模板",是否有其他方法可以实现相同的效果?

template<typename U>
struct Type
{
   typedef JobTypeA<U> type;
};

template<typename U>
struct Type
{
   typedef JobTypeB<U> type;
};

用法:

typedef typename JobTraits<T>::template Type<U>::type JobType;