【问题标题】:Is there any problems with putting a lambda in a concept?将 lambda 放入概念中是否有任何问题?
【发布时间】:2020-08-19 09:33:04
【问题描述】:

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

【问题讨论】:

标签: c++ c++20 c++-concepts


【解决方案1】:

走使用类型特征的路线似乎更惯用,并且适用于所有三大编译器。

template<class T>
concept has_func = std::is_member_function_pointer_v<decltype(&T::func)>;

Godbolt

【讨论】:

  • 虽然不能使用重载方法或模板化方法。
【解决方案2】:

您建议中的 lambda 格式不正确,不需要诊断,如果替换了没有此类成员 funcT,因为它的函数调用运算符模板不存在有效的实例化(并且它可以永远不会被实例化;[temp.res]/8.1)。这与 SFINAE 的限制相同。

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多