将lambda放入概念中是否有任何问题?

问题描述

以这个概念为例-具有名为 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)>;

Godbolt

,

您建议的lambda格式不正确,如果替换的T没有这样的成员func,则不需要诊断,因为其函数调用操作符模板没有有效的实例化(并且永远无法实例化; [temp.res] /8.1)。这与SFINAE的限制相同。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...