Можно ли специализировать определение шаблона на основе существования вложенного typedef параметра типа шаблона?

У меня есть шаблон, шаблон-оболочка класса , на котором я хотел бы специализироваться на основе существования typename T :: context_type . Если объявлено typename T :: context_type , то перегрузки конструкторов и операторов присваивания экземпляра оболочки должны принимать обязательное typename T :: context_type параметр. Кроме того, объекты оболочки будут хранить «контекст» в данных элемента. Если typename T :: context_type не существует, то перегрузки конструкторов и операторов присваивания wrapper будут принимать на один параметр меньше, и дополнительных членов данных не будет.

Возможно ли это? Могу ли я получить следующий код для компиляции без изменения определений config1 , config2 и main () ?

#include <iostream>

template <typename T, bool context_type_defined = true>
class wrapper
{
public:
    typedef typename T::context_type context_type;

private:
    context_type ctx;

public:
    wrapper(context_type ctx_)
        : ctx(ctx_)
    {
        std::cout << "T::context_type exists." << std::endl;
    }
};

template <typename T>
class wrapper<T, false>
{
public:
    wrapper() {
        std::cout << "T::context_type does not exist." << std::endl;
    }
};

class config1 {
public:
    typedef int context_type;
};

class config2 {
public:
};

int main()
{
    wrapper<config1> w1(0);
    wrapper<config2> w2;
}
5
задан Daniel Trebbien 27 September 2011 в 21:32
поделиться