首页 > 解决方案 > 删除函数签名类型的成员性?(lambda 的 operator())

问题描述

我希望能够std::function仅使用封装 lambda 的名称而不是使用硬编码的签名来实例化 a:

#include <functional>

auto l = [](bool b){ return b ? 1 : 0; };
std::function<int(bool)> f(l);            // XXX - don't want the type hardcoded

// Is something like this possible?
// using sig_t = strip_memberness<decltype(l::operator())>;
// std::function<sig_t> f(l);

std::function<>对于参数,有什么方法可以产生int(bool)来自的类型l

即使 C++17 样式的模板参数推导将来可能使这种特定用例成为可能,但不幸的是,我仅限于 GCC 6/C++14,并且还希望访问该类型以用于模板实例化以外的目的。

标签: c++lambdatype-erasuremember-functions

解决方案


这些方面的东西:

#include <functional>

template <typename T>
struct MemberToFunction;

template <typename R, typename T, typename ... Args>
struct MemberToFunction<R (T::*)(Args...)> {
    using type = R(Args...);
};

template <typename R, typename T, typename ... Args>
struct MemberToFunction<R (T::*)(Args...) const> {
    using type = R(Args...);
};

int main()
{
    auto l = [](bool b){ return b ? 1 : 0; };
    std::function<MemberToFunction<decltype(&decltype(l)::operator())>::type> f(l);
}

演示


推荐阅读