我有一些看起来像这样的代码:
template <class T>
T foo(T a) {
if (a) {
// do somethin', returns object of type T
} else {
return NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
但当然它不会编译,因为NULL不是T类型.有人向我建议这个解决方案,但我不喜欢它:
template <class T>
T* foo(T a) {
if (a) {
// do somethin', returns object of type T*
} else {
return nullptr;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在没有使用指针的情况下使该函数能够返回NULL值?
Whi*_*TiM 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 {};
}
}
Run Code Online (Sandbox Code Playgroud)
在接收端,您可以测试其中的值:
auto my_val = foo(obj);
if(my_val){
/* :-) ....knock yourself out! */
}
else{
/* :-( ....we didn't find the value */
}
Run Code Online (Sandbox Code Playgroud)
目前,
您可以使用 Boost.Optional.
或者,如果您使用的是最新的编译器,则可以从中访问它std::experimental::optional.
或者,如果你不想使用Boost及其依赖项,你可以简单地抓住这个小标题(从C++标准的提议者中optional选择一个可选的实现)...它只是标题,所以,你只需要下载/复制单个头文件和#include它.
C++ 17的另一个很酷的事情是,对值的测试现在将变得如此简单:
if(auto my_val = foo(obj); my_val){
// ....knock yourself out!
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到更多的C++ 17特性:C++ 17中有哪些新功能?
| 归档时间: |
|
| 查看次数: |
927 次 |
| 最近记录: |