2

我有一个父包,它实现了一个“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”实例。另一方面,我想避免在父级内部编译所有这些实例,因为父级不应该知道子级。我可以在父包中生成类似未编译对象的东西,然后必须在每个子包中编译它吗?

4

1 回答 1

1

既然goody.h是 的一部分parent,就不应该包括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;

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

于 2013-10-01T10:49:02.667 回答