如何在不使用指针的情况下从模板化方法返回NULL

时间:2016-08-14 01:06:11

标签: c++

我有一些看起来像这样的代码:

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值吗?

2 个答案:

答案 0 :(得分:15)

在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访问它。

  • 或者,如果您不想使用Boost及其依赖项,您只需抓住 tiny header (其中一个的可选实现) proposers of optional 进入C ++标准)...它只是标题,因此,您只需下载/复制该单个头文件并#include即可。

另一个cool thing with C++17是对值的测试现在将简单如下:

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

您可以在此处查看更多C ++ 17功能:What are the new features in C++17?

答案 1 :(得分:-3)

template <class T>

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

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

        return listData[i];

    } else {

        cout << "Does not exist";

    return {};

  }

}

//效果很好