在 c++ 中组织没有模板的类似模板的代码
Organizing template-like code without templates in c++
我有一个父包,它实现了一个类'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.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;
以这种方式组织代码时,没有模板专用化。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值