c++ - 当 lambda 作为参数传入时推导模板参数

标签 c++ c++11 lambda

我正在尝试编写函数 func这样编译器就可以推断出模板参数,当我传入 std::function 时它会起作用,但不适用于 lambda:

template<typename TResult>
TResult func(std::function<TResult()> f)
{
    return TResult();
}

int main()
{
                                // Visual Studio 2013
    int result = func([]() {    // error: 'TResult func(std::function<TResult(void)>)' : could not deduce template argument for 'std::function<TResult(void)>' from 'main::<lambda_d9d7854806072a2cb711f56185602ccb>'
        return 100;
    });

    std::function<int()> testFunc = []() {
        return 100;
    };
    int result2 = func(testFunc); // this works

    return 0;
}

是否可以推导 lambda 的模板参数以便该行可以编译?而不是写 func<int>([](){ return 100; });我想写 func([](){ return 100; });

最佳答案

我来晚了一点:) 有没有std::function

的解决方案
template<typename Class, typename R, typename... Args>
R resultType(R (Class::*)(Args...) const)
{
    return R();
}

template<typename Class, typename R, typename... Args>
R resultType(R (Class::*)(Args...))
{
    return R();
}

template<typename Functor>
auto func(Functor f) -> decltype(resultType(&Functor::operator()))
{
    return resultType(&Functor::operator());
}

关于c++ - 当 lambda 作为参数传入时推导模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245891/

相关文章:

c++ - 如何重载 operator new 和 delete 来跟踪内存?

c++ - 为什么这个程序要交换值?

c++ - 我应该使用它还是 static_cast<void*> 然后 static_cast<myType*> 来避免重新解释?

c++ - OpenGL : drawing line using degenerate triangle

C++ 右值引用转发性能

r - cv.glmnet 和 Leave-one out CV

c++ - C++中的整数到十六进制字符串

c++ - 内存代表多长时间?

c++ - 允许 lambda/回调函数作为模板参数使用多个签名

Java 8 Lambda 同时分组 X 和 Y