我应该将用户定义的概念放在 C++ 项目文件结构中的什么位置?

cin*_*mon 5 c++ c++-concepts c++20

我正在编写一个模板化函数 func ,它将矩阵作为输入。我提供了一个与 func 兼容的 SquareMatrix 类,但我希望其他矩阵实现与 func 兼容。因此,我定义了矩阵的概念。

template<typename T>
concept Matrix = requires (T a, int b, int c) { 
    {a(b, c)} -> std::convertible_to<double>;
    {a.size1()}->std::convertible_to<size_t>;
    {a.size2()}->std::convertible_to<size_t>;
};
Run Code Online (Sandbox Code Playgroud)

我在三个地方使用了这个概念。在我的 SquareMatrix.h 和 SquareMatrix.cpp 中,我使用它来定义一个模板化构造函数,该构造函数从另一个 Matrix 生成 SquareMatrix。在 func.h 中,我用它来定义模板化函数 func。func.h 导入 SquareMatrix.h。

我现在需要决定应该将用户定义的概念矩阵放在哪个文件中。我对这个决定有几个疑问:

  1. 我应该将矩阵概念放在哪个文件中?文件名和扩展名应该是什么?
  2. 每个概念都应该放在自己的文件中吗?我的项目的所有概念都应该共享一个文件吗?
  3. 我正在使用 Visual Studio IDE。这会改变什么吗?

Arj*_*ais 1

根据我的经验,我的建议如下:

  1. 这是一个关于矩阵的概念,因此将其写在“SquareMatrix.h”中是合理的,可以与其他概念一起放在文件的顶部,或者就在类“SquareMatrix”的定义之前。一般来说,您希望在审阅者更容易查找的地方定义您的概念。
  2. 我认为将所有概念分离到一个独立的文件中不是一个好主意。相反,与 API 相关的所有函数、类和概念都应该紧密结合在一起。在本例中,API 与方阵相关,因此所有这些实体应共享同一文件。这样,您就可以在检查、扩展或修复代码时避免从一个文件跳转到另一个文件。
  3. 无论您在 VS 还是其他任何地方使用标准 C++,它都是一样的。如果您正在开发开源代码,您的协作者将在任何 IDE 中访问代码,甚至仅使用文本编辑器(即 vim、emacs)。C++ 对于它们来说都是同一种语言。

还有一个想法:那里有优秀的矩阵库。例如,检查 Armadillo、Eigen 或 Blaze。与其开发自己的矩阵库,不如使用库更方便,代码也更高效。