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