考虑以下类,内部结构Y
被用作类型,例如。模板,以后:有条件的编译时包含/排除基于模板参数的代码?
template<int I>
class X{
template<class T1>
struct Y{};
template<class T1, class T2>
struct Y{};
};
现在,这个例子显然不会编译,与错误的第二X<I>::Y
已被定义或有太多的模板参数。
我想解决没有(额外)部分专业化,因为int I
参数不是唯一的,它的位置可以在不同的部分专业化不同(我的实际结构看起来more like this,以上只是为了简单的问题),所以我想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{};
}
};
它只是是为了节省我很多的代码重复,但如果它在某种程度上可能,我会非常高兴。
编辑:可惜的是,我不能使用显而易见的:variadic模板,因为我使用的是Visual Studio 2010,所以只能使用支持的C++ 0x东西。 :/
+1。有趣的问题。将在办公时间后尝试回答:D – Nawaz 2011-04-14 06:00:26
我很高兴地等待着它。 :)我的思路是,它应该是可能的,因为编译器知道它需要知道的一切,以及编译时。 – Xeo 2011-04-14 06:09:56
@ Xeo:你允许使用C++ 0x feautures吗? – Nawaz 2011-04-14 06:32:28