在 c++ 中组织没有模板的类似模板的代码

Organizing template-like code without templates in c++

本文关键字:代码 c++      更新时间:2023-10-16

我有一个父包,它实现了一个类'goody',并具有以下结构:

parent/include/goody.h
parent/src/goody.cpp

此包由多个子包使用,child_1使用结构child_n

child_i/include/child_details.h
child_i/src/main.cpp

其中 main.cpp 使用"goody"。重要的部分是child_details.h向父级提供实现"goody"所必需的信息。goody.h 看起来像这样:

#include "child_details.h"
class goody
{
  double arr_[child_details::num_elements];
}

其中"num_elements"是一个常量,需要在编译时知道。

现在,我知道模板将是用于此类问题的正确结构,但是 (a( 我不想在每个child_i包中添加专用化,并且 (b( "num_elements"在父包中到处都是,需要大量特定于模板的代码,我想避免这种情况。

因此,我的问题是:使用 CMake 组织我的包的干净方法是什么?我无法在父包中编译父包,因为每个孩子都会有一个"goody"的实例。另一方面,我想避免在父级内部编译所有这些实例,因为父级不应该知道子级。是否有类似未编译的对象可以在父包内生成,然后必须在每个子包中编译?

因为goody.hparent的一部分,所以它不应该包含child_details.h。您可以改用一个goody_child模板,但您可以有一个非模板goody_base对象来实现除依赖于子属性的那些内容之外的所有内容。子属性可以通过goody_child实现的虚函数来知道。

class goody_base {
public:
    //...
    virtual double * arr () = 0;
    virtual size_t num_elements () const = 0;
    //...
    void print_arr () {
        for (size_t i = 0; i < num_elements(); ++i) {
            std::cout << arr()[i] << std::endl;
        }
    }
    //...
};
template <typename DETAILS>
class goody_child {
    double arr_[DETAILS::num_elements];
    //...
public:
    double * arr () { return arr_; }
    size_t num_elements () const { return DETAILS::num_elements; }
    //...
};

然后,你的孩子代码可以做这样的事情:

#include "goody.h"
#include "child_details.h"
typedef goody_child<child_details> goody;

以这种方式组织代码时,没有模板专用化。