C++ 静态条件中的编译器警告

C++ 静态条件中的编译器警告,c++,visual-studio,visual-studio-2008,templates,compiler-warnings,C++,Visual Studio,Visual Studio 2008,Templates,Compiler Warnings,我使用一个模板参数来确定是否必须执行某个行为。但此代码在VS2008上生成警告:warning 26 warning C4127:conditional expression是常量 下面是代码示例: template <class param, bool param2=true> class superclass1 { public: int foo() { if(param2) doSomthingMore(); return 1;

我使用一个模板参数来确定是否必须执行某个行为。但此代码在VS2008上生成警告:
warning 26 warning C4127:conditional expression是常量

下面是代码示例:

template <class param, bool param2=true>
class superclass1
{
public:
  int foo()
  {
     if(param2)
        doSomthingMore();

     return 1;
   }
};
模板
类超类1
{
公众:
int foo()
{
如果(参数2)
doSomthingMore();
返回1;
}
};

有没有办法转换代码以删除警告并获得相同的功能?

这是通过部分专门化完成的。最粗糙的版本如下所示:

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;
  }
};
模板类超类1;
模板类超类1
类超类1
{
公众:
int foo()
{
doSomthingMore();
返回1;
}
};
模板类超类1
类超类1
{
公众:
int foo()
{
返回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());
  }
};
#包括
模板类Foo
{
结构真_标记{};
结构假_标记{};
void f_impl(true_tag=true_tag()){}//您的代码在这里。。。
void f_impl(false_tag=false_tag()){}/…这里
公众:
void foo()
{
f(typename std::conditional::type());
}
};

或者用
#pragma warning(disable:4127)
#pragma warning(default:4127)
来封装您的敏感代码,以避免重复写入相同的逻辑(尽管它不适用于问题中描述的简单情况)。

是的,它被称为“模板元编程”,警告与“默认参数”无关。是的,你是对的,我应该为这个问题找到一个更好的标题,你知道@KerrekSB吗?我以前做同样的事情时会收到这个消息,但现在不会了。可能是在VC++2010上,它不再给出警告。与模板专业化相比,我更喜欢这个。你也可以用template
int
s做类似的事情,这是专门化所不能做的。@KerrekSB:“傻”是术语“MSVC”的“替代表示法”关键字。我希望这不是唯一的解决方案,因为这种模式在类中不止一个位置存在。@Drahakar:我添加了一个更复杂的本地版本。TMP是一个巨大的主题,如果您只是刚刚开始,请确保您正在进入一个纯魔法的世界。:-)另一个好问题是:我应该纠正这个警告,还是只是用pragma禁用它?