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

上記は、特殊化された特性クラスの「不完全な型の typedef」のためにコンパイルされません。g++ 4.7.2でstd = c ++ 11の「エイリアステンプレート」を使用して、これを機能させました。ただし、VS2010 はまだサポートしていません。「エイリアステンプレート」なしで同じことを達成するための回避策はありますか?

4

1 に答える 1

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;
于 2013-03-20T12:47:29.280 に答える