【发布时间】:2020-11-07 14:57:29
【问题描述】:
我有一个带有自定义Vector 类的文件vector.h,其中向量条目的数据类型应限制为实现函数f 的类型:
template <typename T>
concept Vector_Type = requires (T a) {
f(a);
};
template <Vector_Type T>
class Vector {};
此外,我有多个文件,其中为不同的数据类型定义了函数 f,例如以下datatype_int.h 头文件:
int f(int a) { return 2*a; }
如果我在vector.h 之后包含datatype_int.h,编译器会抱怨不满足约束:
#include "vector.h"
#include "datatype_int.h"
int main() {
Vector<int> v; // Error: constraints not satisfied
return 0;
}
这不是一个很有帮助的错误消息,我想避免依赖于包含的顺序。但是,无法在vector.h 中为所有可能的数据类型T 声明函数f,因为我不知道将使用哪些数据类型。
我该如何解决这个问题?
【问题讨论】:
-
我认为没有办法解决这个问题。对于具有类类型的
Vector的实例化,该概念应该通过ADL 找到合适的f,但要使用内置类型,我认为您别无选择,只能在概念定义之前声明f。跨度> -
听到我打算做的事情实际上适用于类类型,我很惊讶。我刚刚测试了它,它工作得非常好。类类型和内置类型之间存在这种差异的原因是什么?这已经在很大程度上解决了我的问题。
-
这与ADL有关。对于采用类类型的
fs,ADL 将在关联的命名空间中查找所有fs,因此它可以工作。 ADL 不适用于内置类型,因此您要查找的声明需要在您需要查找发生的点之前按词法声明。 -
现在我再想一想,这可能可以通过模块而不是文本包含来解决,但我对模块或 ADL 如何与之交互的了解还不够。
标签: c++ c++20 c++-concepts