2013-03-20 2 views
0

Я хочу, чтобы выбрать шаблон из класса признака, как в следующем:частично специализированный шаблон в качестве типа элемента черта

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

выше обыкновение компиляции из-за «ЬурейиЕ неполный тип» в специализированных классов. Я получил эту работу, используя «шаблоны псевдонимов» в std = C++ 11 с g ++ 4.7.2. Однако VS2010 еще не поддерживает его. Есть ли какие-либо обходные пути для достижения того же без «шаблонов псевдонимов».

ответ

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; 
+0

Это работает. Спасибо :) –

Смежные вопросы