Предупреждение компилятора в статическом режиме - PullRequest
6 голосов
/ 17 ноября 2011

Я использую параметр шаблона, чтобы определить, нужно ли выполнять определенное поведение или нет.Но этот код генерирует предупреждение на 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;
   }
};

Есть ли способ преобразовать код, чтобы удалить предупреждение и получить то же самоеособенности?

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Это делается через частичную специализацию. Самая грубая версия выглядит так:

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());
  }
};
0 голосов
/ 10 января 2014

Или просто заключите свой секретный код с помощью #pragma warning( disable : 4127 ) и #pragma warning( default: 4127 ), чтобы избежать написания одной и той же логики дважды (хотя это не относится к простому случаю, описанному в вопросе).

...