考虑一个函数
template <typename Ret>
Ret function(...) {
Ret a;
// . . . do something with a
return a;
}
如果我将其称为
function<void>();
编译器说
错误:变量或字段'a'声明为void
错误:带有值的return语句,函数返回'void'[-fpermissive]
如何在此功能中强制执行检查,例如
template <typename Ret>
Ret function(...) {
// if (Ret is void) return;
Ret a;
// . . . do something with a
return a;
}
我知道C ++ 11有std::is_void
和std::is_same
bool same = std::is_same<Ret, void>::value;
C ++ 03中的任何内容?提前谢谢。
答案 0 :(得分:4)
您可以专门编写或编写自己的is_same
,这非常简单,当然也可以使用非标准库(例如boost)。
专业化
template<typename Ret>
Ret function(...)
{
Ret a;
// ...
return a;
}
template<>
void function<void>(...)
{
}
自有
template<typename T, typename U>
struct is_same
{
static const bool value = false;
};
template<typename T>
struct is_same<T, T>
{
static const bool value = true;
};
BTW与is_same
并不是那么简单,你认为。您还需要专业化或重载
template<typename Ret>
typename enable_if<!is_same<Ret, void>::value, Ret>::type
function(...)
{
Ret a;
// ...
return a;
}
template<typename Ret>
typename enable_if<is_same<Ret, void>::value, Ret>::type
function(...)
{
}
所以,专业化更简单。
答案 1 :(得分:1)
运行时if
是不够的,模板的所有实例都必须是可编译的。在您的情况下,专业化可能是最好的行动方案:
template <typename Ret>
Ret function(...) {
Ret a;
// . . . do something with a
return a;
}
template <>
void function<void>(...) {
return;
}
此外,C ++ 03还有boost::is_same
。