我有一个实现类'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整理我的包裹的干净方法是什么?我无法在parent内部编译父包,因为每个 child 都会有一个'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;

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

关于c++ - 在C++中无需模板即可组织类似模板的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19113599/

10-13 06:12