Там какой-либо путь состоит в том, чтобы достигнуть указанного поведения? Если существует некоторый прием, или это могло бы быть сделано с помощью черт или 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
}
Просто специализируйтесь на void:
template <typename T> struct Functional {
T operator()() const {
T a(5);
return a;
}
};
template <> struct Functional<void> {
void operator()() const {
}
};
Просто скажите следующее. Это прекрасно работает с T
, будучи void
и эквивалентно показанному вами коду
T operator()() const {
return static_cast<T>(5);
}
, вы можете использовать специализацию
template <> struct Functional<void> {
void operator()() const {
}
};
Это должно работать
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
}
С этим кодом проблемы посерьезнее, чем кажется на первый взгляд. Например, если вы должны были перенаправить возвращаемое значение Functional другой функции, тогда вы не можете просто указать Functional для void - весь набор должен быть указан для void, поскольку если у вас есть функция, которая принимает void, вы можете Не передайте это пустое выражение. И, конечно, вы не можете создавать переменные с void и тому подобное. В целом, проще сказать, что void является незаконным, чем пытаться с этим бороться.
Есть и другие ответы, в которых уже есть явный ответ о специализации.