考虑以下类,其中内部结构体 Y
作为类型被使用,例如在后续的模板中:
template<int I>
class X{
template<class T1>
struct Y{};
template<class T1, class T2>
struct Y{};
};
显然,这个例子无法编译,会报错第二个X<I>::Y
已经被定义或模板参数过多。
我希望能够解决这个问题而不需要使用(额外的)部分特化,因为int I
参数并不是唯一的,在不同的部分特化中它的位置可能会有所不同(我的实际结构看起来更像这样,上面只是为了简化问题),所以我想要一个适用于每个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东西。 :/