Можно ли специализировать определение шаблона, основываясь на существовании вложенной 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;
}