c++ - 我如何判断一个元组在 C++ 中是否为空

标签 c++ stl c++-standard-library

<分区>

我想知道如何识别我的元组是否为空? 请注意,我将 std::tuble 与 std::map 结合使用,如下所示:

typedef std::tuple<SDESType,INT32,std::string> SDesItem;
typedef std::map<SDESType,SDesItem> SDesItemMap;

现在我想检查 SDesItemMap 的第二个值,即一个元组,是否为空?

if(SDesItems[SDESType] != NULL) // this is error

最佳答案

std::tuple就像三个值绑在一起一样。除了每个成员的空状态外,它没有预定义的“空”或“零”状态。空值始终与上下文相关,通常表示位于常规类型值域之外的值。

例如,一个自然数只能是0(或1,取决于你的定义)向上。因此,使用 int为您提供了一种方便的方式来表示域外的值,并且应该不规则地对待。

要在您的示例中清楚地表示,请使用 optional<tuple<...>>作为映射值(如果您想明确声明“给定键处有一个空值”)。此类型声明您通过实例化 optional 获得的类型的可能值模板现在是原始类型的所有值,一个特殊的(/empty/none)值。

你也可以声明元组的部分可以是空的(什么都没有),比如

tuple <
    std::string,   // empty string ("") can be treated as "empty state"
    optional<int>, // if you don't want to treat 0 (or -1) as "empty"
>

optional<>不是 std:: 的一部分但是,因此您必须编写自己的实现或使用 the Boost one .另一种方法是使用 value_ptr (再次提升),但在这里它可能不会给您带来任何好处。

关于c++ - 我如何判断一个元组在 C++ 中是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24184732/

相关文章:

c++ - 函数原型(prototype)中的 const

c++11 - 使用 STL 查找小于当前的最大元素

c++ - 以相反的顺序插入 vector

c++ - 在面向值的属性 setter 中使用 std::move() 是否有任何陷阱?

c++ - 如何比较两个函数的签名?

c++ - 为什么我会收到 'multiple definition' 错误?我如何解决它?

c++ - C++ 中的 vector 与数组?

c++ - std::sort (stable_sort) 比较函数返回值的混淆结果

c++ - 尝试从 std::stack 中删除项目时出错

c++ - 为什么 g++ 4.0 版本的 map<T>::erase(map::<T> iterator) 不返回迭代器?