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

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

Это возможно? Могу ли я получить следующий код для компиляции без изменения определений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;
}

Ответы на вопрос(3)

Ваш ответ на вопрос