【问题标题】:Compiler warning in static conditional静态条件下的编译器警告
【发布时间】:2011-12-30 23:57:56
【问题描述】:

我使用模板参数来确定是否必须执行某个行为。但是这段代码会在 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;
   }
};

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

【问题讨论】:

  • 是的,它被称为“模板元编程”。
  • 顺便说一句,警告与“默认参数”无关。
  • 是的,你是对的,我应该为这个问题找到一个更好的标题,你知道@KerrekSB吗?
  • 我曾经在做同样的事情时收到此消息,但现在没有了。它可能在 VC++ 2010 上不再发出警告。我更喜欢模板专业化。你也可以用模板ints 做类似的事情,这是你不能用专业化做的。
  • @KerrekSB:“傻”是“MSVC”一词的“替代表示”关键字

标签: c++ visual-studio visual-studio-2008 templates compiler-warnings


【解决方案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;
  }
};

更复杂的方法可能会声明一个成员模板函数并且只专门化那个。这是一个带有辅助标记类的解决方案:

#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());
  }
};

【讨论】:

  • 我希望这不是唯一的解决方案,因为这种模式在课堂上不止一个地方存在。
  • @Drahakar:我添加了一个更复杂的本地版本。 TMP 是一个庞大的主题,如果您才刚刚开始,请放心,您正在进入一个纯粹的魔法世界。 :-)
  • 另一个好问题是:我应该更正这个警告,还是只是编译指示禁用它?
【解决方案2】:

或者只是用#pragma warning( disable : 4127 )#pragma warning( default: 4127 ) 将您的敏感代码括起来,以避免两次编写相同的逻辑(尽管它不适用于问题中描述的简单案例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多