可以表达lambda表达式的"类型"吗?

Yeh*_*oni 52 c++ lambda stl c++11

将lambda表达式视为可调用对象的"语法糖",可以表达未命名的基础类型吗?

一个例子:

struct gt {
    bool operator() (int l, int r) {
        return l > r;
    }
} ;
Run Code Online (Sandbox Code Playgroud)

现在,[](int l, int r) { return l > r; }是上述代码的优雅替代(加上gt的可调用对象的必要创建),但有没有办法表达gt(类型)本身?

一个简单的用法:

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;
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 60

不,你不能把它放进去decltype因为

lambda表达式不应出现在未评估的操作数中

您可以执行以下操作

auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> s(n);
Run Code Online (Sandbox Code Playgroud)

但这真的很难看.请注意,每个lambda表达式都会创建一个新的唯一类型.如果之后您在其他地方执行以下操作,t则其类型不同s

auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> t(n);
Run Code Online (Sandbox Code Playgroud)

您可以std::function在这里使用,但请注意,这将产生一点运行时成本,因为它需要间接调用lambda函数对象调用操作符.这里可能忽略不计,但如果你想以这种方式传递函数对象可能会很重要std::sort.

std::set<int, function<bool(int, int)>> s([](int l, int r) { return l > r; });
Run Code Online (Sandbox Code Playgroud)

一如既往,首先代码然后配置文件:)