使 std::set 在比较元素时使用转换运算符
Make std::set to use conversion operator when compare elements
目前我使用std::map
保存key/value对:
#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
我必须使用信息量不大的名称 second
。 first
也一样。我想将其简单命名为 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
每次对键类型都使用转换运算符。有用。但这是禁止的做法吗?有没有未定义的行为?
对我来说,它在技术上看起来是有效的。
但是也属于"making your code so unnecessarily complex that a programmer has to look twice or thrice at it before they comprehend what on earth you're doing, and can validate that you're doing it correctly, and for basically no tangible benefit"的范畴,很不好
事实上,您 — 代码自己的作者,一点也不逊色! — 觉得有必要来这里请语言律师来验证代码的正确性是一个很大的危险信号,这可能 不 值得。
如果您在任何时候觉得 .first
和 .second
对您的代码的描述不够充分,您可以使用以下魔法在本地绕过它:
auto& key = it->first;
auto& payload = it->second;
甚至:
auto& payload = getPayload(it);
其中 getPayload
是采用您的特定类型的迭代器的适当函数。
这些方法的好处是相当明显,并且不需要召集 session C++ 最高法院首先对其进行检查。
目前我使用std::map
保存key/value对:
#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
我必须使用信息量不大的名称 second
。 first
也一样。我想将其简单命名为 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
每次对键类型都使用转换运算符。有用。但这是禁止的做法吗?有没有未定义的行为?
对我来说,它在技术上看起来是有效的。
但是也属于"making your code so unnecessarily complex that a programmer has to look twice or thrice at it before they comprehend what on earth you're doing, and can validate that you're doing it correctly, and for basically no tangible benefit"的范畴,很不好
事实上,您 — 代码自己的作者,一点也不逊色! — 觉得有必要来这里请语言律师来验证代码的正确性是一个很大的危险信号,这可能 不 值得。
如果您在任何时候觉得 .first
和 .second
对您的代码的描述不够充分,您可以使用以下魔法在本地绕过它:
auto& key = it->first;
auto& payload = it->second;
甚至:
auto& payload = getPayload(it);
其中 getPayload
是采用您的特定类型的迭代器的适当函数。
这些方法的好处是相当明显,并且不需要召集 session C++ 最高法院首先对其进行检查。