Рассмотрим следующий класс: внутренняя структура Y
используется как тип, например. в шаблонах, позже:
template<int I>
class X{
template<class T1>
struct Y{};
template<class T1, class T2>
struct Y{};
};
Теперь этот пример, очевидно, не будет компилироваться, с ошибкой, что второй X<I>::Y
уже определен или что у него слишком много параметров шаблона.
Я бы хотел разрешить это без частичной специализации, поскольку параметр int I
не является единственным, и его положение может отличаться в разных частичных специализациях (моя фактическая структура выглядит больше похоже на это, это просто для простоты вопроса), поэтому мне бы хотелось one class fits every I
решение.
Моя первая мысль была явно enable_if
, но, похоже, это не срабатывает, например. Я все равно получаю те же ошибки:
// assuming C++11 support, else use boost
#include <type_traits>
template<int I>
class X{
template<class T1, class = std::enable_if<I==1>::type>
struct Y{};
template<class T1, class T2, class = std::enable_if<I==2>::type>
struct Y{};
};
Итак, поскольку enable_if
завершается с ошибкой, я надеюсь, что есть другой способ добиться следующей проверки времени компиляции:
template<int I>
class X{
__include_if(I == 1){
template<class T1>
struct Y{};
}
__include_if(I == 2){
template<class T1, class T2>
struct Y{};
}
};
Было бы просто сохранить много дублирования кода, но я был бы очень рад, если бы это было возможно.
Edit: К сожалению, я не могу использовать очевидные: variadic templates, поскольку я использую Visual Studio 2010, так что только С++ 0x материал, который поддерживается там, я могу использовать.:/