我希望我能够使用新的模板参数推导的地方之一,是在构造std::set的/ std::maps /任何其他带有自定义比较器的容器-我的目标是创建一条一行语句,这将创建一个高效的带有lambda比较器的集合。
std::set<int, std::function<bool(int, int)>> s([](int a, int b) {return a > b;});但由于它使用的是std::function,所以它的速度要慢得多。
另一种选择是:
auto mycomp = [](int a, int b) {return a > b; };
std::set<int, decltype(mycomp)> s(mycomp);它完成了工作,但1)它需要2行代码,并创建mycomp变量2)我需要显式地传递mycomp的类型。
正如我在参考页上读到的,没有一个标准容器有针对这种情况的推导指南。不幸的是,恐怕使用当前的语言标准(C++17)也不能做到这一点,因为我们可以发现:
仅当不存在模板参数列表时,才会执行
类模板参数推导。如果指定了模板参数列表,则不会进行演绎。
这背后的原因是什么?为什么他们不允许部分参数演绎?我猜它有一些我忽略的问题,但在我看来,它将不仅仅是有帮助的。
发布于 2018-05-28 19:40:44
作为替代方案,您仍然可以将旧的make_xxx
template <typename T, typename COMP>
std::set<T, COMP> make_set(COMP comp)
{
return std::set<T, COMP>{comp};
}
auto s = make_set<int>([](int a, int b) {return a > b; });发布于 2018-05-28 19:43:00
在一行中(C++17)
std::set s(std::initializer_list<int>{}, [](int a, int b) {return a > b; });发布于 2018-05-28 19:35:40
您应该做的是编写一个比较器函数器类型,因此在使用set时不需要代理它。这将是更多的代码行(残暴!),但实际上在每一个方面都更好:
struct MyComparator
{
bool operator()(int a, int b) const { ...; }
};
using MySet = std::set<int, MyComparator>;从那时起,您只需在需要的地方创建自定义排序集。
https://stackoverflow.com/questions/50565431
复制相似问题