将std :: enable_if与离线成员函数和模板化静态成员条件一起使用

问题描述

我想使用SFINAE创建一个带有Consumer仿函数的模板化成员函数。某物是否是消费者取决于模板化的static constexpr bool isConsumer成员变量。我将代码简化为以下示例:

#include <type_traits>

template <typename T>
struct Container {
    T data[100];

    template <typename Consumer>
    static constexpr bool isConsumer = std::is_invocable_r_v<void,Consumer,T>;

    template <typename Consumer,std::enable_if_t<isConsumer<Consumer>,int> = 0>
    void forEach(const Consumer &consumer);
};

template <typename T>
template <typename Consumer,std::enable_if_t<Container<T>::template isConsumer<Consumer>,int>>
void Container<T>::forEach(const Consumer &consumer)
{
    for (int i = 0; i < 100; ++i) {
        consumer(data[i]);
    }
}

由于我不理解的原因而无法编译:

<source>:16:20: error: out-of-line definition of 'forEach' does not match any declaration in 'Container<T>'

void Container<T>::forEach(const Consumer &consumer)

                   ^~~~~~~

当我内联isConsumer时,它的编译效果很好,例如,直接使用std::is_invocable_r_v。我想避免这种情况,因为在我的真实代码中,Consumer的签名非常复杂,并且需要大量复制/粘贴。

也不可以将isConsumer拉到类之外,因为在我的真实代码中,它依赖于Container内部的私有typedef。它必须在类中。

如何在此处正确使用std::enable_if

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)