gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:45 25 4
gpt4 key购买 nike

我有这个:

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);
}
// ...
};

我的意图是能够像这样实例化一个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;
});

当然,第二个构造函数签名会与第一个构造函数签名冲突。为了解决这个冲突,我想限制第二个构造函数的可能模板实例化。

我不想让它太复杂。你能帮助我吗?我的尝试:

template<typename F, typename = std::enable_if_t< // what now? how to check that F is callable (and if simple to check, with appropriate signature)

最佳答案

您正在寻找 std::is_invocable :

template<typename F, typename = std::enable_if_t<
std::is_invocable<F&, int, int>>

F& 因为您将它作为左值调用,然后它只是一个参数类型列表。


以上需要 C++17。它可以在 C++14 上实现,但在您的情况下,我们也可以采用更简单的方法,只需执行以下操作:

template <typename F, typename = decltype(std::declval<F&>()(1, 1))>

F& 同上原因,其余的表达方式比较熟悉。由于我们使用 int 进行调用,因此我们不关心 INVOKE 允许的其他事情(例如,指向成员的指针)。

关于c++ - enable_if 模板参数是 lambda(具有特定签名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50859115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com