2013-10-01 43 views
2

我有一个实现类“好极了”,并具有以下结构的父包:组织类似模板的代码,而在C++模板

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 lookes类似:

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

其中“num_elements”是一个常量,需要在编译时是已知的。 (a)我不想在每个child_i包中添加特化和(b)'num_elements'遍布整个地方在父包中,并需要大量特定于模板的代码,这是我想避免的。

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

+1

只是为了明确一件事:每个孩子最终在一个单独的可执行文件,对吧?因为如果你将两个不同数量的元素连接在一起的孩子,你会违反[ODR](http://en.wikipedia.org/wiki/One_Definition_Rule),使整个事情成为非法的C++。 – Angew

+0

您正在为每个孩子_anyway_添加单独的专业化,因为您必须为每个不同的“child_details.h”单独编译它。 –

+0

@Angew每个孩子是一个单独的包,并有自己的make.cpp和它自己的child_details.h。 – Alex

回答

1

由于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; 

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

+0

不幸的是,大部分的'goody'类都依赖于child_details.h。如果我必须将'goody'分成依赖于child_details.cpp的代码和不符合代码的代码,则非相关代码将非常少。这意味着我必须写入每个孩子的大部分代码。 – Alex

+0

我在封装组织级别上而不是在代码级别上寻找更多解决方案。我想知道是否有像源容器的东西,我可以在父包中生成,然后在子包中,我会编译这个容器与适当的包括child_details.h。 – Alex

+0

@Alex:可以在标题中创建模板代码,并根据需要简单包含它,或者正确地概括代码,以便代码可以编译一次并链接到所有子包。后者是首选,因为它可以在构建过程中节省相当多的时间。但是,使用不同的编译器选项(包括您的案例中的路径)多次编译代码只会让任何跟在您后面的人都难以理解,并且与合适的模板相比绝对没有优势。 –