我有这样的事情:
template<typename T>
class Image {
Image(int w, int h, T defaultVal){
for(int i=0; i<h; i++)
for(int j=0; j<w; j++)
pixel(j, i) = defaultVal;
}
template<typename F>
Image(int w, int h, F initializer){
for(int i=0; i<h; i++)
for(int j=0; j<w; j++)
pixel(j, i) = initializer(j, i);
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
我的目的是能够实例化Image这样的:
Image<int> img0(w, h, 0); // image of zeroes
Image<int> imgF(w, h, [](int j, int i){ // checkerboard image
return (j/10+i/10) % 2;
});
Run Code Online (Sandbox Code Playgroud)
但是当然第二个构造函数签名会与第一个构造函数签名冲突。为了解决这个冲突,我想限制第二个构造函数可能的模板实例化。
我不想让它太复杂。你能帮助我吗?我的尝试:
template<typename F, …Run Code Online (Sandbox Code Playgroud) 关于隐式lambda转换的问题.我有这种类型:
class A {
public:
A(std::function<void(std::string)> func) {
....
}
};
Run Code Online (Sandbox Code Playgroud)
我相信它有一个有效的复制构造函数.
我想做以下几点
A a = [](std::string param) { ... };
Run Code Online (Sandbox Code Playgroud)
要么
void MyFunc(A a) { ... } // definition
MyFunc([](std::string param) { ... }); // call
Run Code Online (Sandbox Code Playgroud)
然而这两个产生编译错误:
注意:候选构造函数不可行:第一个参数没有从'(lambda at ....)'到'std :: function'的已知转换
为什么是这样?或者这可能吗?