Вопрос шаблона C ++ - PullRequest
10 голосов
/ 14 июля 2010

Есть ли способ добиться указанного поведения? Если есть какой-то трюк или это можно сделать с помощью черт или enable_if, пожалуйста, дайте мне знать.

template <typename T> struct Functional {

   T operator()() const {

      T a(5);

                // I want this statement to be tranformed into
                // plain 'return;' in case T = void
      return a; // <---
   }
};

int main() {

   Functional<int> a;
   a();

   Functional<void> b;
   b(); // <--- Compilation error here
}

Ответы [ 5 ]

24 голосов
/ 14 июля 2010

Просто специализируйтесь на пустоте:

template <typename T> struct Functional {
   T operator()() const {
      T a(5);
      return a;
   }
};
template <> struct Functional<void> {
   void operator()() const {
   }
};
10 голосов
/ 15 июля 2010

Просто скажи следующее. Он отлично работает с T, являющимся void и эквивалентен коду, который вы показали

T operator()() const {
  return static_cast<T>(5);
}
3 голосов
/ 14 июля 2010

Вы можете использовать специализацию


template &lt> struct Functional<void> {

   void operator()() const {
   }
};
1 голос
/ 14 июля 2010

Это должно работать

template <> struct Functional<void> //specialized for 'void'
{
   void operator()() const {

       //do something

      return ; //optional
   }
};

РЕДАКТИРОВАТЬ:

Вы также можете написать (упрощенный подход)

T operator()() const {

   return T(5); // static_cast<> not even required
}
0 голосов
/ 14 июля 2010

Есть большие проблемы с этим кодом, чем кажется на первый взгляд.Например, если вы должны были перенаправить возвращаемое значение Functional в другую функцию, то вы не можете просто специфицировать Functional для void - весь лот должен быть указан для void, так как если у вас есть функция, которая принимает void, вы можетеНе передавайте это пустое выражение.И, конечно, вы не можете создавать переменные с void и тому подобное.В целом, проще сказать, что void незаконен, чем пытаться с ним справиться.

Существуют и другие ответы, в которых уже есть явный ответ по специализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...