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

Там какой-либо путь состоит в том, чтобы достигнуть указанного поведения? Если существует некоторый прием, или это могло бы быть сделано с помощью черт или 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
}
10
задан Konrad 14 July 2010 в 10:22
поделиться

5 ответов

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

template <typename T> struct Functional {
   T operator()() const {
      T a(5);
      return a;
   }
};
template <> struct Functional<void> {
   void operator()() const {
   }
};
24
ответ дан 3 December 2019 в 14:00
поделиться

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

T operator()() const {
  return static_cast<T>(5);
}
10
ответ дан 3 December 2019 в 14:00
поделиться

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


template <> struct Functional<void> {

   void operator()() const {
   }
};
3
ответ дан 3 December 2019 в 14:00
поделиться

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

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
}
1
ответ дан 3 December 2019 в 14:00
поделиться

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

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

0
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: