【问题标题】:How to check if a template pair has value如何检查模板对是否有价值
【发布时间】:2020-11-30 17:59:44
【问题描述】:

我正在使用模板 sn-p 在 C++ 中编写一个 trie 结构:

pair<char,T>

我有一个方法 void empty() 我想在其中检查是否未设置根的 第二个值(值等于默认构造函数值或详细信息:值将存储其他对类型。)。我知道默认构造函数会为数据类型 int 应用 0,但是如何在模板中检查呢?

另一篇文章提到了这一点: return root == new Trie() (对未知 == 运算符失败)

提前致谢

【问题讨论】:

  • 零是一个值,所以从这个角度来看,你的问题没有意义。请从tour 开始阅读How to Ask
  • std::pair 是一个值类型,所以它总是“设置”,因为它总是有一个值。您想知道T 对象是否已正确初始化?好吧,您必须确保在创建该对的代码中,否则将其设为可为空的类型(例如指针)。
  • 这是有道理的,因为默认构造函数将始终应用一个值,如果是 int,则为 0。问题不在于 0,而在于模板解决方案。
  • 无关:return root == new Trie&lt;char,T&gt;() 会造成即时内存泄漏并始终返回false。你在哪里找到那个帖子的?

标签: c++ templates trie


【解决方案1】:

不能“未设置”std::pairs 成员。

您可以使用std::optional 为可选值建模。


"...值等于默认构造函数..."

当然你可以检查当前值是否等于初始值:

std::pair<int,int> x;
if (x.first == 0) {
    std::cout << "value of x.first is that of a default constructed std::pair<int,int>";
}

或者对于std::pair&lt;int,T&gt; 的第二个成员:

if (x.second == T{} ) {
    std::cout << "second has same value as a default constructed T";
}

完整示例:

#include <iostream>
#include <utility>

template <typename T>
bool check_if_default_second(const std::pair<int,T>& p) {
    return p.second == T{};
}


int main() {
    std::pair<int,int> p;
    std::cout << check_if_default_second(p);
}

【讨论】:

  • 我改变了最初的问题。我无法更改代码。基本上 pair.second 包含其他 pairs ,这会创建一棵树。所以我想检查第二个值是否除了从构造函数创建的值之外没有对(或其他值)。换句话说。我想检查 second.vales 是否曾被代码触及。
  • 我必须检查第二个值,而不是第一个值,即 T。
  • @SebyKiunke 刚刚添加了一个专门针对您上次编辑的部分。不管是first 还是second 变化不大
  • @SebyKiunke fwiw,我知道这并不能解决您真正想问的问题。这在很大程度上是因为问题不太清楚。听起来像XY problem。也许在您询问实际问题的地方打开另一个问题。是什么让您认为您需要检查是否已设置配对成员?您在这里提到了一些东西,但不清楚
  • @SebyKiunke 你不明白什么?它将对的第二个成员与默认构造的T 进行比较。如果我正确理解了这个问题,这就是你想要的
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 2011-02-05
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多