我一直在玩定义中的推断返回类型,它们解析为与声明相同的类型.这有效:
template <typename>
struct Cls {
static std::size_t f();
};
template <typename T>
decltype(sizeof(int)) Cls<T>::f() { return 0; }
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改定义的东西,应该更换等同sizeof(int)与sizeof(T) 失败
template <typename T>
decltype(sizeof(T)) Cls<T>::f() { return 0; }
Run Code Online (Sandbox Code Playgroud)
gcc的错误(clang几乎相同):
error: prototype for ‘decltype (sizeof (T)) Cls<T>::f()’ does not match any in class ‘Cls<T>’
decltype(sizeof(T)) Cls<T>::f() { return 0; }
^~~~~~
so.cpp:4:24: error: candidate is: static std::size_t Cls<T>::f()
static std::size_t f();
^
Run Code Online (Sandbox Code Playgroud)
函数参数类型出现同样的问题:
template <typename>
struct Cls {
static void f(std::size_t);
};
template <typename T>
void …Run Code Online (Sandbox Code Playgroud) 我想使用 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]);
}
}
Run Code Online (Sandbox Code Playgroud)
由于我不理解的原因,这不会编译:
<source>:16:20: error: out-of-line definition of 'forEach' does not match …Run Code Online (Sandbox Code Playgroud)