[英]C++03 check if template parameter is void?
考慮一個功能
template <typename Ret>
Ret function(...) {
Ret a;
// . . . do something with a
return a;
}
如果我這樣稱呼
function<void>();
編譯器說
錯誤:變量或字段“ a”聲明為無效
錯誤:函數中返回值“ 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中有什么嗎? 提前致謝。
您可以專門化或編寫自己的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;
};
順便說一句,使用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(...)
{
}
因此,僅專業化就更簡單。
運行時if
是不夠的,模板的所有實例必須是編譯。 在您的情況下,專業化可能是最好的做法:
template <typename Ret>
Ret function(...) {
Ret a;
// . . . do something with a
return a;
}
template <>
void function<void>(...) {
return;
}
此外,C ++ 03 boost::is_same
提供了boost::is_same
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.