删除函数签名类型的成员资格? (lambda的operator())

时间:2018-07-07 23:43:43

标签: c++ lambda type-erasure member-functions

我希望能够仅使用封装的lambda的名称而不是具有硬编码的签名来实例化 $('#gender').bootstrapToggle({ on: 'Male', off: 'Female', onstyle: 'success', offstyle: 'danger' }); $('#gender').change(function(){ if($(this).prop('checked')) { $('#hidden_gender').val('Male'); } else { $('#hidden_gender').val('Female'); } });

std::function

对于#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)

即使C ++ 17样式的模板参数推导将来可能使这种特殊情况成为可能,我很不幸地仅限于GCC 6 / C ++ 14,并且我也希望出于模板之外的目的访问类型实例化。

1 个答案:

答案 0 :(得分:3)

遵循以下原则:

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

Demo