问题描述
以这个概念为例-具有名为 func 的成员的所有类都应满足此概念。
template<class T>
concept has_func =
requires(T) {
{ [](T& t,auto&&... args){
t.func(args...);
}
};
};
struct STemplateFunc {
template<class T>
void func(T){};
};
template<has_func E>
void FuncFunc(E a) {}
int main() {
FuncFunc(STemplateFunc{});
}
此技巧是否存在任何问题-将lambda放入概念中还是将通用lambda或可变参数lambda放入?
gcc 10.2接受它:godbolt
解决方法
使用类型特征的途径似乎更惯用,并且也适用于所有三大编译器。
template<class T>
concept has_func = std::is_member_function_pointer_v<decltype(&T::func)>;
,
您建议的lambda格式不正确,如果替换的T
没有这样的成员func
,则不需要诊断,因为其函数调用操作符模板没有有效的实例化(并且永远无法实例化; [temp.res] /8.1)。这与SFINAE的限制相同。