为什么我的示例不满足这个 "requires" 表达式?

Why doesn't my example satisfy this "requires" expression?

我正在尝试将概念与可变参数模板一起使用。我的模板 class 如下。这个概念应该说:“每个类型 T 应该有一个成员函数 Func 接受类型 FuncArgType. 的输入”

#pragma once

#include <tuple>
#include <concepts>
#include <iostream>

template<typename FuncArgType, typename... Ts>
requires requires
(FuncArgType func_arg, std::tuple<Ts...> args) {
    std::apply([&func_arg](auto&... ts) {(ts.Func(func_arg), ...); }, args);
}
class MyClass
{
public:
    MyClass() {}
};

这在我看来是正确的,尽管我对 std::apply 的使用可能有误。然后我尝试使用 MyClass 创建一个对象。我定义两个classes AB作为我的TsFuncArgTypeint.

class A {
public:
    A() {}
    void Func(int i) {
        std::cout << "Called Func of A";
    }

};


class B {
public:
    B() {}
    void Func(int i) {
        std::cout << "Called Func of B";
    }

};

我现在尝试创建一个 MyClass 的实例。

#include "MyClass.h"

int main() {
    MyClass<int, A, B> my_class{}; // constraints not satisfied

    return 0;
}

错误信息是

Source.cpp(4,19): error C7602: 'MyClass': the associated constraints are not satisfied

(还有其他几个错误消息,但它们本质上都是说 my_class 无效。)

为什么 AB 不满足我的约束条件?我的约束是否表达了我想要表达的内容?如何让我的约束说出上面的粗体语句?

您不需要 lambda 或 std::apply。直接使用参数包即可:

template<typename FuncArgType, typename... Ts>
requires requires(FuncArgType func_arg, Ts... args) 
{
    (args.Func(func_arg), ...);
}

请注意,这允许隐式转换。

Here 是一个完整的例子。

不过,你的想法是正确的。 C++20 中有一个更改,允许在未计算的上下文中捕获 lambda。有关详细信息,请参阅 答案。如果您更新编译器,您的概念应该是有效的。最新的 VS 预览版 (16.11) 支持此更改(尽管智能感知仍显示为错误)。