为什么我的示例不满足这个 "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 A
和B
作为我的Ts
。 FuncArgType
是 int
.
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
无效。)
为什么 A
和 B
不满足我的约束条件?我的约束是否表达了我想要表达的内容?如何让我的约束说出上面的粗体语句?
您不需要 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) 支持此更改(尽管智能感知仍显示为错误)。
我正在尝试将概念与可变参数模板一起使用。我的模板 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 A
和B
作为我的Ts
。 FuncArgType
是 int
.
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
无效。)
为什么 A
和 B
不满足我的约束条件?我的约束是否表达了我想要表达的内容?如何让我的约束说出上面的粗体语句?
您不需要 lambda 或 std::apply
。直接使用参数包即可:
template<typename FuncArgType, typename... Ts>
requires requires(FuncArgType func_arg, Ts... args)
{
(args.Func(func_arg), ...);
}
请注意,这允许隐式转换。
Here 是一个完整的例子。
不过,你的想法是正确的。 C++20 中有一个更改,允许在未计算的上下文中捕获 lambda。有关详细信息,请参阅