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

时间:2013-10-01 10:15:08

标签: c++ templates cmake

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

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)我不想在每个child_i包中添加特化和(b)' num_elements'在父包中到处都是,并且需要很多特定于模板的代码,我想避免这些代码。

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

1 个答案:

答案 0 :(得分: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;

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