问题描述
我想使用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 (将#修改为@)