可以expressionlambdaexpression式的“types”吗?
将lambdaexpression式看作可调用对象的“语法糖”,可以表示无名的基础types吗?
一个例子:
struct gt { bool operator() (int l, int r) { return l > r; } } ;
现在, [](int l, int r) { return l > r; }
[](int l, int r) { return l > r; }
是上述代码的优雅替代品(加上可调用对象的必要创build),但有没有一种方法来expressionGT(types)本身?
一个简单的用法:
std::set<int, gt> s1; // A reversed-order std::set // Is there a way to do the same using a lambda? std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;
不,你不能把它放在decltype
因为
lambdaexpression式不应出现在未评估的操作数中
你可以做下面的事情
auto n = [](int l, int r) { return l > r; }; std::set<int, decltype(n)> s(n);
但这真的很难看。 请注意,每个lambdaexpression式都会创build一个新的唯一types。 如果事后你在别的地方做下面的事情,那么t
有不同于s
types
auto n = [](int l, int r) { return l > r; }; std::set<int, decltype(n)> t(n);
你可以在这里使用std::function
,但是请注意,这会导致一小部分的运行时间成本,因为它需要间接调用lambda函数对象调用操作符。 在这里可能可以忽略不计,但是如果你想以这种方式将函数对象传递给std::sort
,这可能是很重要的。
std::set<int, function<bool(int, int)>> s([](int l, int r) { return l > r; });
一如既往,第一个代码然后configuration文件
直接回答你的问题:没有。
你需要使用类似函子的任何types都可以分配的东西。 一个例子是std :: function,如sbi的答案所示。 但是,这不是lambdaexpression式的types。
你可以使用一个小类lambda_wrapper <>来以低成本包装lambda。 它比std :: function快得多,因为没有虚函数调用和dynamic内存分配。 包装工作通过推导lambda参数列表和返回types。
#include <iostream> #include <functional> #include <set> template <typename T, typename ... Args> struct lambda_wrapper : public lambda_wrapper<decltype(&T::operator())(Args...)> {}; template <typename L> struct lambda_wrapper<L> { private: L lambda; public: lambda_wrapper(const L & obj) : lambda(obj) {} template<typename... Args> typename std::result_of<L(Args...)>::type operator()(Args... a) { return this->lambda.operator()(std::forward<Args>(a)...); } template<typename... Args> typename std::result_of<const L(Args...)>::type operator()(Args... a) const { return this->lambda.operator()(std::forward<Args>(a)...); } }; template <typename T> auto make_lambda_wrapper(T&&t) { return lambda_wrapper<T>(std::forward<T>(t)); } int main(int argc, char ** argv) { auto func = make_lambda_wrapper([](int y, int x) -> bool { return x>y; }); std::set<int, decltype(func)> ss(func); std::cout << func(2, 4) << std::endl; }