考虑下面的类,内部结构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 东西。:/