簡體   English   中英

C ++ 03檢查模板參數是否為空?

[英]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_voidstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM