我希望我能够在构建
自C++11以来我可以做到的是:
std::set
/ std::map
或任何其他使用自定义比较器的容器时,利用新的模板参数推导功能。我的目标是创建一个一行代码的语句,它将创建一个具有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)下也无法做到这一点,因为可以找到以下内容:只有在没有模板参数列表的情况下才执行类模板参数推导。如果指定了模板参数列表,则不进行推导。这背后的原因是什么?为什么他们不允许部分参数推导?我想我忽略了一些问题,但在我看来,这将非常有帮助。
operator()
重载的结构体不好吗?为什么你必须(甚至想要)使用lambda? - Nicol Bolas