可以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有不同于stypes

 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; }