std :: string与模板一起使用,检查是否为空

Arc*_*man 2 c++

我想使用一个接受类型的通用参数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

Lig*_*ica 6

首先,如果你使用了正确的术语,你可以更好地研究这个主题.空字符串不是" 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.但这是一个抽象泄漏,因为接受指针表示除了此函数之外的其他意图; 它还会在明确所有权语义方面造成一些混乱.