静态条件下的编译器警告

发布于 2024-12-16 17:22:28 字数 354 浏览 2 评论 0原文

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

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

I use a template parameter to determine if a certain behavior must be done or not. But this code generate a warning on VS2008 : Warning 26 warning C4127: conditional expression is constant

Here an exemple of the code :

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

     return 1;
   }
};

Is there a way to tranform the code to remove the warning and get the same features?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

捶死心动 2024-12-23 17:22:28

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

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

This is done via partial specialization. The crudest version looks like this:

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;
  }
};

A more sophisticated approach might declare a member template function and only specialize that. Here's a solution with auxiliary tag classes:

#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());
  }
};
晨曦慕雪 2024-12-23 17:22:28

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

Or just enclose your sensitive code with #pragma warning( disable : 4127 ) and #pragma warning( default: 4127 ) to avoid writing the same logic twice (though it doesnt apply to the simple case described in the question).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文