C++ 在c+中组织类似模板的代码,而不使用模板+;

C++ 在c+中组织类似模板的代码,而不使用模板+;,c++,templates,cmake,C++,Templates,Cmake,我有一个实现类“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”所需的信息。 很好,h看起来像: #include "child_details

我有一个实现类“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”所需的信息。 很好,h看起来像:

#include "child_details.h"
class goody
{
  double arr_[child_details::num_elements];
}
其中'num_elements'是一个常量,需要在编译时知道

现在,我知道模板将是解决这类问题的正确构造,但是(a)我不想在每个子包中添加专门化,并且(b)“num_元素”在父包中到处都是,需要大量特定于模板的代码,我希望避免这种情况


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

由于
goody.h
父包的一部分,因此它不应包含
子包详细信息.h
。您可以使用一个
goody_child
模板,但可以使用一个非模板
goody_base
对象来实现除依赖于子属性之外的所有内容。子属性可以通过
goody\u 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; }
    //...
};
class goody_base{
公众:
//...
虚拟双*arr()=0;
虚拟大小\u t num\u元素()常量=0;
//...
无效打印错误(){
对于(size_t i=0;iSTD::只是想清楚一点:每个孩子都是在一个单独的可执行文件中结束的,对吗?因为如果你把两个孩子的数量和不同的元素联系起来,你会违反,使整个事情都是非法的C++。每个不同的“child_details.h”.@Angew每个child都是一个单独的包,有自己的make.cpp和child_details.h。@Jan你说得对,我在child_details.h中添加了专门的信息,但在我的情况下,这个头文件无论如何都是给定的。在我使用模板的情况下,我必须在每个child包中添加一个goody_specialized_I.cpp,以便进行特殊处理将“goody”设置为专用。这将是一个更大的开销,因为我必须为父类和子类中的每个类执行此操作。@Alex:不,您没有。您只需使用它即可专门化
goody
。并且在这两种情况下生成的代码量完全相同。不幸的是,“goody”类的大部分依赖于子类的详细信息。h.如果我必须将“goody”评级为依赖child_details.cpp的代码和不依赖child_details.cpp的代码,非依赖代码将非常少。这意味着我必须将大部分代码写入每个child。我更多地是在包组织级别而不是代码级别上寻找解决方案。我想知道是否有什么就像一个源文件容器,我可以在父包中生成,然后在子包中生成,我将使用适当的包含child_details.h来编译这个容器。@Alex:在头中生成一个模板代码,并根据需要简单地包含它,或者正确地概括代码,这样代码就可以编译一次并链接到所有子包子包。最好使用后者,因为它将在构建过程中节省大量时间。但是使用不同的编译器选项多次编译代码(在您的案例中包括路径)这只会让你后面的人很难理解,而且与正确的模板相比绝对没有优势。我想避免使用模板,因为它会使父包中的代码变得杂乱无章,但我想你是对的,如果在编译级别进行专门化,代码会变得不那么透明。可能,我将不得不服用避孕药,只需使用模板代码。谢谢大家!
#include "goody.h"
#include "child_details.h"

typedef goody_child<child_details> goody;