繁体   English   中英

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

[英]enable_if template param is lambda (with particular signature)

我有这样的东西:

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允许的其他操作(例如,指向成员的指针)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM