У меня есть шаблон, шаблон-оболочка класса
, на котором я хотел бы специализироваться на основе существования 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;
}