Рассмотрим следующий класс с внутренней структурой 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{};
}
};
Было бы просто сэкономить много дублирования кода, но я был бы очень рад, если бы это было как-то возможно.
Редактировать: К сожалению, я не могу использовать очевидные: переменные шаблоны, так как я использую Visual Studio 2010, поэтому я могу использовать только те материалы C ++ 0x, которые поддерживаются там. : /