Вопрос о шаблоне С++

Есть ли способ достичь указанного поведения? Если есть какой-то трюк, или это можно сделать с помощью признаков или 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
}

Ответ 1

Просто выделите для void:

template <typename T> struct Functional {
   T operator()() const {
      T a(5);
      return a;
   }
};
template <> struct Functional<void> {
   void operator()() const {
   }
};

Ответ 2

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

T operator()() const {
  return static_cast<T>(5);
}

Ответ 3

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


template &lt> struct Functional<void> {

   void operator()() const {
   }
};

Ответ 4

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

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
}

Ответ 5

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

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