gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:08 25 4
gpt4 key购买 nike

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

最佳答案

因为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com