gpt4 book ai didi

c++ - 如何将比较器与 is_transparent 类型一起使用?

转载 作者:可可西里 更新时间:2023-11-01 18:38:29 28 4
gpt4 key购买 nike

在 C++14 中,我们可以将某些关联容器(如 std::set)的元素与存储在容器中的其他类型进行比较。当比较器有 is_transparent 时它应该工作表示为一种类型(参见例如 std::set::find )。

假设我有一个字符串包装器,它对字符串执行一些检查(如果它的格式是有效格式等等 - 不是很重要,但构建它足够重以至于我想避免它+它可以抛出异常) 并将其存储在 std::set 中以具有唯一值的容器。我应该如何为它写一个比较器?它应该像下面这样吗?我可以重载并使用我的 sw::operator<() 吗?达到同样的效果?

class sw
{
public:
explicit sw(const std::string& s) : s_(s) { /* dragons be here */ }
const std::string& getString() const { return s_; }

bool operator<(const sw& other) const { return s_ < other.s_; }

private:
std::string s_;
};

struct Comparator
{
using is_transparent = std::true_type;

bool operator()(const sw& lhs, const std::string& rhs) const { return lhs.getString() < rhs; }
bool operator()(const std::string& lhs, const sw& rhs) const { return lhs < rhs.getString(); }
bool operator()(const sw& lhs, const sw& rhs) const { return lhs < rhs; }
};

int main()
{
std::set<sw, Comparator> swSet{ sw{"A"}, sw{"B"}, sw{"C"} };
std::cout << std::boolalpha << (swSet.find(std::string("A")) != swSet.end()) << std::endl;
}

我相信上面的代码应该按预期工作,但是当我用 g++4.9 和 clang++3.6 测试它时,两者都产生了关于缺少来自 string 的转换的错误。至 key_type好像 Comparator::operator() 的字符串重载从未被考虑在内。我错过了什么吗?

最佳答案

是的,该代码是正确的,但重载 operator< 会更简单允许将您的类型与 std::string 进行比较然后使用 std::less<> (即 std::less<void> )已经“透明”了。

inline bool operator<(const sw& lhs, const std::string& rhs) { return lhs.getString() < rhs; }
inline bool operator<(const std::string& lhs, const sw& rhs) { return lhs < rhs.getString(); }

std::set<sw, std::less<>> swSet{ sw{"A"}, sw{"B"}, sw{"C"} };

此外,可能值得注意的是,您定义什么并不重要 is_transparent到,这些中的任何一个都会与您对它的定义具有相同的效果:

using is_transparent = std::false_type;

using is_transparent = void;

关于c++ - 如何将比较器与 is_transparent 类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265368/

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