我想使用一个接受类型的通用参数T的函数,并在函数内检查传入的变量是否为NULL.我可以简单地用这样的原始类型做到这一点:
if (var) doSomething();
Run Code Online (Sandbox Code Playgroud)
但是,为了检查它是否是一个std::string,我需要做:
if (!var.empty()) doSomething();
Run Code Online (Sandbox Code Playgroud)
检查传入参数的最佳,最通用的方法是NULL什么?我想使用所有原始类型和std::string.也许我可以使用typeid?
首先,如果你使用了正确的术语,你可以更好地研究这个主题.空字符串不是" NULL"; 零等价整数也不是" NULL".唯一可以是" NULL"的是指针(虽然我们nullptr现在用于那些).所以我们马上就可以停止使用该术语了.
任意类型都没有通用的"未设置"值,因此没有通用的方法来检测这种情况.但是,您可以使用明确添加此可能性的包装类型,例如boost::optional<T>:
#include <boost/optional.hpp>
#include <iostream>
template <typename T>
void foo(boost::optional<T> arg)
{
if (arg)
std::cout << arg.get() << '\n';
}
int main()
{
boost::optional<int> a{123};
boost::optional<int> b{boost::none};
boost::optional<float> c{boost::none};
boost::optional<float> d{123.456};
foo(a);
foo(b);
foo(c);
foo(d);
// Or, pass it directly:
foo(boost::optional<std::string>{"abc"});
foo(boost::optional<std::string>{boost::none});
foo(boost::optional<std::string>{}); // as if boost::none were given
}
// $ g++ -std=c++14 -O2 -Wall -Wextra -pedantic -pthread main.cpp && ./a.out
// 123
// 123.456
// abc
Run Code Online (Sandbox Code Playgroud)
你唯一的另一个选择是接受指向对象NULL的指针并检查指针上的ity.但这是一个抽象泄漏,因为接受指针表示除了此函数之外的其他意图; 它还会在明确所有权语义方面造成一些混乱.
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |