Zee*_*Zon 1 c++ lambda templates c++11
我遇到了编译问题.我不明白为什么下面的代码不能编译:
#include <functional>
namespace async {
template<class ...T>
using Callback = std::function<void(const std::string& result, T ...args)>;
template<class Signature>
class Function;
template<class Res, class ...Args>
class Function<Res(Args...)>
{
std::function<void(Args ...args, const Callback<Res>&)> m_function;
public:
Function(std::function<void(Args ...args, const Callback<Res>&)>&& function) : m_function(std::move(function)) {}
Function& operator=(std::function<void(Args ...args, const Callback<Res>&)>&& function) {m_function = std::move(function); return *this;}
void operator()(Args... args, const Callback<Res>& callback) const {m_function(args..., callback);}
};
}
async::Function<int(int)> getF()
{
return [](int i, const async::Callback<int> callback)
{
callback("", i);
};
}
int main(int argc, char** argv)
{
auto f0 = getF();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc说:
函数'async :: Function getF()':error:无法将'getF():: __ lambda0 {}'从'getF():: __ lambda0'转换为'async :: Function'
icc说:
错误:没有合适的用户定义转换"lambda [](int,async :: Callback) - > void"to"async :: Function"存在
现在,如果我更换
return [](int i, const async::Callback<int> callback)
{
callback("", i);
};
Run Code Online (Sandbox Code Playgroud)
通过
return async::Function<int(int)>([](int i, const async::Callback<int> callback)
{
callback("", i);
});
Run Code Online (Sandbox Code Playgroud)
然后它工作.为什么我需要明确地演绎以及如何避免这种情况?
一个更简单的解决方案是用类似的东西替换类Function
template<class Signature>
using Function = std::nullptr_t;
template<class Res, class ...Args>
using Function<Res(Args...)> = std::function<void(Args ...args, const Callback<Res>&)>;
Run Code Online (Sandbox Code Playgroud)
但专业化<Res(Args...)>不编译...
没有Function接受lambda的构造函数.有一个接受一个std::function,并且还有一个std::function接受lambda 的构造函数,但C++永远不会为你组合两个隐式的用户定义转换.
定义所需构造函数的最简单方法是
template <class T>
Function (T&& t) : m_function(std::forward<T>(t)) {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |