我使用模板参数来确定是否必须执行某种行为。但是此代码会在VS2008上生成警告:Warning 26 warning C4127: conditional expression is constant
这里是代码的例子:
template <class param, bool param2=true>
class superclass1
{
public:
int foo()
{
if(param2)
doSomthingMore();
return 1;
}
};
有没有办法转换代码以删除警告并获得相同的功能?
答案 0 :(得分:4)
这是通过部分专业化完成的。最粗糙的版本如下所示:
template <typename, bool> class superclass1;
template <class param> class superclass1<param, true>
class superclass1
{
public:
int foo()
{
doSomthingMore();
return 1;
}
};
template <class param> class superclass1<param, false>
class superclass1
{
public:
int foo()
{
return 1;
}
};
更复杂的方法可能会声明成员模板功能,并且只专门 。这是一个带有辅助标签类的解决方案:
#include <type_traits>
template <bool B> class Foo
{
struct true_tag {};
struct false_tag {};
void f_impl(true_tag = true_tag()){} // your code here...
void f_impl(false_tag = false_tag()){} // ... and here
public:
void foo()
{
f(typename std::conditional<B, true_tag, false_tag>::type());
}
};
答案 1 :(得分:0)
或者只需将敏感代码与#pragma warning( disable : 4127 )
和#pragma warning( default: 4127 )
括起来,以避免两次写入相同的逻辑(尽管它不适用于问题中描述的简单情况)。