C++ 从参数推断类型';s返回类型

C++ 从参数推断类型';s返回类型,c++,c++11,gcc,c++14,C++,C++11,Gcc,C++14,我理解模板不能从赋值推断类型,即 template <typename T> T aFunction (int a) { /*...*/ }; // This obviously won't work 因此,在使用时,函数应该做什么没有歧义: std::function<double(int)> blah = [](int x){ return x / 2.0f; }; aFunction(blah); std::function blah=[](int x){ret

我理解模板不能从赋值推断类型,即

template <typename T>
T aFunction (int a) { /*...*/ }; // This obviously won't work
因此,在使用时,函数应该做什么没有歧义:

std::function<double(int)> blah = [](int x){ return x / 2.0f; };
aFunction(blah);
std::function blah=[](int x){return x/2.0f;};
一个功能(废话);
唉,编译器不会与我合作:

没有用于调用“aFunction”的匹配成员函数

已忽略候选模板:无法匹配 “功能”针对(lambda在 文件.hpp:274:16)'

有没有办法做到这一点?除了模板专门化(这是一个非常的泛型类),或者是一个伪参数(我还没有那么绝望)


p.D.:

充分披露:以上只是问题的简化,我需要的正是:

template <typename T>
class MyStuff {

    template <typename ReturnType>
    MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){ 
        /*for each stuff in MyStuff do a(stuff)*/ 
    }
}
模板
类MyStuff{
模板
MyStuff函数(std::函数a){
/*对于MyStuff中的每个内容,请执行一个(stuff)*/
}
}

如果
MyStuff
包含类型为
T
的属性和一系列
inline
函数,如注释中提到的
affunction

,则此操作:

#include <functional>

template <typename T>
struct MyStuff {
    template <typename ReturnType>
    MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){ 
        return {};
    }
};

int main() {
    MyStuff<int> stuff;
    std::function<double(int)> fn = [](int) { return 0.; };
    stuff.aFunction(fn);
}

查看它。

模板的
关键字发生了什么事?你说的“编译器不会与我合作”是什么意思?有错误消息吗?遗憾的是,我无法重现(它实际上是有效的):我的猜测是,如果不将lambda嵌入
std::function
的某个地方(在您的问题中没有显示),您就不能同时进行模板参数推断和隐式转换time@whitelionV依我拙见你不必删除它。这是一个有趣的问题。你的问题让我很难接受,我只知道模板演绎法可以被广泛使用。你唯一错过的就是提供完整的mcve,这并不坏,因为你已经提供了一个很好的小片段。
template <typename T>
class MyStuff {

    template <typename ReturnType>
    MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){ 
        /*for each stuff in MyStuff do a(stuff)*/ 
    }
}
#include <functional>

template <typename T>
struct MyStuff {
    template <typename ReturnType>
    MyStuff<ReturnType> aFunction(std::function<ReturnType(T)> a){ 
        return {};
    }
};

int main() {
    MyStuff<int> stuff;
    std::function<double(int)> fn = [](int) { return 0.; };
    stuff.aFunction(fn);
}
int main() {
    MyStuff<int> stuff;
    stuff.aFunction([](int) { return 0.; });
}
template <typename T>
struct MyStuff {
    template <typename F>
    auto aFunction(F &&f) -> MyStuff<decltype(std::forward<F>(f)(std::declval<T>()))> { 
        return {};
    }
};