gpt4 book ai didi

c++ - 使 std::set 在比较元素时使用转换运算符

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

目前我使用 std::map 来保存键/值对:

#include <map>

using K = int;
struct P {}; // some useful payload

int main()
{
std::map< K, P const > m;
m.insert({1, {}});
auto it = m.find(1);
// access:
it->first;
it->second;
}

int 这里只是举例。 mapped_type 在我的用例中始终是 const

要访问负载 P const,我必须使用不太有用的名称 secondfirst 也是如此。我想将其简单命名为 payload 或其他名称。

为此,我发明了以下方法:

#include <set>

using K = int;
struct P {};

struct A
{
K key;
P payload;
operator K const & () const { return key; }
};

struct less
{
using is_transparent = void;
bool operator () (K const & l, K const & r) const
{
return l < r;
}
};

int main()
{
std::set< A, less > s;
s.insert({1, {}});
auto it = s.find(1);
// access:
it->key;
it->payload;
}

在这里,我让 std::set 每次都对键类型使用转换运算符。有用。但这是禁止的做法吗?是否有未定义的行为

最佳答案

对我来说,它在技术上看起来是有效的。

但它也属于“使您的代码变得不必要地复杂,以至于程序员必须看两三次才能理解您到底在做什么,并且可以验证您是否正确地执行”的类别,而且基本上没有任何实际利益”,这是非常不好的。

事实上,您 — 代码自己的作者,同样如此! — 觉得需要来这里请语言律师来验证代码的正确性是一个很大的危险信号,这可能值得。

如果在任何时候您觉得 .first.second 对您的代码的描述不够充分,您可以使用以下魔法在本地绕过它:

auto& key     = it->first;
auto& payload = it->second;

甚至:

auto& payload = getPayload(it);

其中 getPayload 是采用您的特定类型的迭代器的适当函数。

这些方法的好处是相当明显,并且不需要召开 C++ 最高法院的 session 来首先检查它们。

关于c++ - 使 std::set 在比较元素时使用转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40708006/

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