gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:49 24 4
gpt4 key购买 nike

我想使用一个函数,该函数接受类型为 T 的一般参数,并在函数内检查传入的变量是否为 NULL。我可以简单地用这样的原始类型来做到这一点:

if (var) doSomething();

但是,为了检查它是否是一个 std::string,我需要做:

if (!var.empty()) doSomething();

检查传入的参数是否为 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

( live demo )

您唯一的其他选择是接受指向对象的指针并检查指针上的 NULL 实体。但这是一个抽象泄漏,因为接受一个指针表示一个意图而不是这个函数的意图;它还在明确的所有权语义方面造成了一些困惑。

关于c++ - std::string 与模板一起使用,检查是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com