相关疑难解决方法(0)

enable_if 模板参数是 lambda(具有特定签名)

我有这样的事情:

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)

c++ lambda templates enable-if c++14

2
推荐指数
1
解决办法
914
查看次数

C++ lambda转换 - 为什么候选构造函数不可行:没有已知的从lambda到std :: function的转换

关于隐式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'的已知转换

为什么是这样?或者这可能吗?

c++ lambda

2
推荐指数
1
解决办法
278
查看次数

标签 统计

c++ ×2

lambda ×2

c++14 ×1

enable-if ×1

templates ×1