【发布时间】:2018-05-28 11:31:30
【问题描述】:
我希望能够使用新模板参数推导的地方之一是构造 std::set's / std::maps / 任何其他带有自定义比较器的容器 - 我的目标是创建一个-line 语句,它将使用 lambda 比较器创建一个有效的集合。
从 C++11 开始我能做的是:
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)来完成,正如人们可以发现的那样:
类模板参数推导仅在不存在模板参数列表时执行。如果指定了模板参数列表,则不会进行推导。
这背后的原因是什么?为什么他们不允许部分论证推论?我想它有一些我忽略的问题,但在我看来它会很有帮助。
【问题讨论】:
-
部分扣除先在提案中,但已被删除。见c17-class-template-partial-deduction
-
@Kaznov:“我的目标是创建一行语句,这将使用 lambda 比较器创建有效的集合。” ...为什么这是你的目标?仅创建具有
operator()重载的结构有什么问题?为什么您必须(甚至想要)使用 lambda?
标签: c++ templates c++17 template-argument-deduction