部分专业模板作为特征成员类型

时间:2013-03-20 12:40:51

标签: c++ templates

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

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;
}

由于特殊traits类中的“typedef of a incomplete type”,上面不会编译。我使用std = c ++ 11中的'alias templates'和g ++ 4.7.2一起工作。但是VS2010还不支持它。没有“别名模板”,是否有任何变通方法可以实现相同目的。

1 个答案:

答案 0 :(得分:1)

怎么样

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;