我想从特质类中选择一个模板,如下所示:
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还不支持它。没有“别名模板”,是否有任何变通方法可以实现相同目的。
答案 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;