为什么C++中的模板混合插件不是主流
Why are template mixins in C++ not more of a mainstay?
我在C++中经常使用模板混合,但我想知道为什么没有更多地使用该技术。这似乎是重复使用的终极目的。这种能力和效率的结合是我真正喜欢C++的原因之一,我不认为自己会转向JIT语言。
本文:http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_good是一个很好的背景,如果你不知道它们是什么,并且在重用和性能方面非常清楚。
mixin的问题是…构造。
class Base1 { public: Base1(Dummy volatile&, int); };
class Base2 { public: Base2(Special const&, Special const&); };
现在,我的超级混音:
template <typename T>
struct Mixin: T {};
你注意到这里的问题了吗?我到底该怎么把参数传递给基类的构造函数呢?Mixin
应该提出什么样的构造函数?
这是一个难题,直到C++11增强了语言以获得完美的转发,它才得到解决。
// std::foward is in <utility>
template <typename T>
struct Mixin: T {
template <typename... Args>
explicit Mixin(Args&&... args): T(std::forward<Args>(args...)) {}
};
注意:欢迎双重检查
所以现在我们真的可以使用mixin。。。只需要改变人们的习惯:)
当然,我们是否真的想要是一个完全不同的主题。
mixin的一个问题(你引用的那篇糟糕的文章很乐意跳过)是你完全失去了依赖隔离。。。以及CCD_ 2的用户随后被绑定来编写模板方法的事实。在非常大的代码库中,依赖关系比性能更受关注,因为依赖关系消耗人力周期,而性能只消耗CPU周期。。。而且这些通常更便宜。
模板要求实现在翻译单元中是可见的,而不仅仅是在链接时(如果您只使用指针或引用实例化,C++11会解决这个问题)。这是企业环境中低级代码的一个主要问题:对实现的更改将触发(可能是自动的,也可能不是自动的)大量库和客户端重新编译,而不仅仅需要重新链接。
此外,每个模板实例化都会创建一个不同的类型,这意味着用于任何模板实例化的函数都必须能够接受它们——要么它们自己被强制模板化,或者他们需要一种形式的切换到运行时多态性(这通常很容易做到:只需要一个抽象基类来表达一组支持的操作,以及一些"给我一个访问器"函数,该函数返回一个派生对象,该对象带有指向虚拟调度表中模板实例化和相关实体的指针)。
无论如何,这些问题通常是可管理的,但管理所涉及的耦合、依赖关系和接口的技术比简单的混合技术本身要公开、理解和容易获得得多。模板和策略类BTW.也是如此。
- 从C++本机插件更新Vector3数组
- 使用CMake创建QML插件
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- D3D11-将混合权重和索引传递到顶点着色器
- clang 插件:在编译过程中修改 AST
- 实现动态插件管理器
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- Agora.io 虚幻引擎插件构建错误
- 使用带有C++对象和标准库容器的插件系统
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- C++分数混合比较运算符错误
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 是否可以混合使用SFINAE和模板专业化?
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 使用混合的 C/C++ 源文件构建一个 NodeJS 插件
- 在 c++ 中使用 alsa 的 dmix 插件进行音频混合
- 为什么C++中的模板混合插件不是主流