簡體   English   中英

如何在不使用指針的情況下從模板化方法返回NULL

[英]How to return a NULL from a templated method, without using a pointer

我有一些看起來像這樣的代碼:

template <class T>
T foo(T a) {
 if (a) {
   // do somethin', returns object of type T
 } else {
   return NULL;
 }
}

但當然它不會編譯,因為NULL不是T類型。有人向我建議這個解決方案,但我不喜歡它:

template <class T>
T* foo(T a) {
 if (a) {
   // do somethin', returns object of type T*
 } else {
   return nullptr;
 }
}

我想知道如何在沒有使用指針的情況下使該函數能夠返回NULL值?

在C ++ 17中,您將能夠使用std::optional<T> 你可以做這樣的事情:

template <class T>
std::optional<T> foo(T a) {
    if (a) {
        // do somethin', returns object of type T
        return std::make_optional(/*Anything that constructs `T`*/);
    } else {
        return {};
    }
}

在接收端,您可以測試其中的值:

auto my_val = foo(obj);
if(my_val){
     /* :-) ....knock yourself out! */
}
else{
     /* :-( ....we didn't find the value */
}

目前,

  • 您可以使用Boost.Optional

  • 或者,如果您使用的是最新的編譯器,則可以從std::experimental::optional訪問它。

  • 或者,如果你不想使用升壓和它的依賴,你可以簡單地抓住這個小小的頭 (從一個可選的工作實現的提議者optional進入C ++標准)......它只是頭,所以,只有你需要下載/復制單個頭文件並#include它。


C ++ 17的另一個很酷的事情是,對值的測試現在將變得如此簡單:

if(auto my_val = foo(obj); my_val){
     // ....knock yourself out!
}

你可以在這里看到更多的C ++ 17特性:C ++ 17中有哪些新功能?

template <class T>

T list<T>::getData(int i){

    if (i < iSize && i >= 0){

        return listData[i];

    } else {

        cout << "Does not exist";

    return {};

  }

}

//效果很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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