基于模板参数的条件编译时包含/排除代码?
|
考虑下面的类,其中内部结构“ 0”用作类型,例如。在模板中,稍后:
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东西。 :/
没有找到相关结果
已邀请:
5 个回复
郡豪靠暖
如果最终遇到“ 11”垃圾,则可以很容易地编写元函数或使用Boost MPL。 答案2。 可以将类似名称的模板命名为不同的模板,但是如果嵌套在SFINAE控制的类型中,它们仍然保持不同。
僻朵庙惩竣
说明:从根本上讲,它是部分专业化概念的扩展,但是不同之处在于,不是在
中进行专业化,而是委托给可以仅在
中进行专业化的特定类。这样,您只需为每个
定义一次
版本。然后可以重用
的多个专业。
支架用于使
类中的
易于操作。 编辑:这是一个测试用例,它显示了如果您输入错误数量的模板参数会发生什么:http://ideone.com/QzgNP
渐首洽陈染
我怀疑答案是否那么简单! 编辑(模拟部分专业化): @Xeo,我能够编译以下代码,并且看起来很完整。
但是,您可以在此处互换使用X <1>和X <2>。但是在您提到的更广泛的示例中,这是无关紧要的。仍然,如果需要,您可以支票
和
。
壤欠攻混
蜂佬渺
,但可以任意复杂)来选择所需的一个。但是,您需要一些脚手架才能使用构造函数:
如果每个X都实例化两个
N都存在问题,则可以尝试将它们包装为一个元元函数(类似于
那样)并使用
。