有时我想重载或专门化由于循环依赖而早先已调用的模板。
由于它们是模板,解决方案通常是拆分声明和定义。
但是,如果这些模板是#included 库的一部分,这意味着您需要两个#include:
- 一个用于声明,必须在所有专业之前。
- 一个用于“后期”定义,毕竟它必须是专业化的。
(删除的 C++导出关键字(C++11 之前)是一个潜在的解决方案,但它有很多问题)。
有没有人有任何解决方案来避免需要第二个#include?
我考虑过:
尝试制作某种单一的“late_call”转发模板函数,该函数在源代码末尾定义,并使用某种机制从其参数中推断出目标函数。不幸的是,我只能看到这在非常特殊的情况下是如何工作的。
- [--] 大部分都行不通。
- [-] 在源代码末尾需要一个#include。
通过预处理器创建要包含的可扩展标头列表,然后通过单个最终#include 将它们全部包含在最后。使用大量#defines 可以破解这样一个具有固定数量位置的列表。
- [-] 人为限制。
- [-] 使用宏#includes,它搞砸了一些工具。
- [-] 丑得要命。
- [-] 在源代码末尾需要一个#include。
创建我自己的手动 pragma-type 命令,然后编写一个外部工具来运行预处理代码并在编译之前移动内容。
- [+] 完美运行。
- [+] 不需要在源代码末尾添加任何内容。
- [--] 这几乎可以确保没有人会想要使用我的库,而且我自己也可能会讨厌它。
创建一个“late.hpp”,在其中我为每个后期定义添加#includes,由#ifdefs 保护以检查是否需要它们。
- [-] 在源代码末尾需要一个#include。
- [--] 完全打破模块化。
在末尾手动添加后期定义标题列表。
- [--] 打破模块化。如果其他实现发生变化,源文件可能会间接获得新的后期定义要求。
- [-] 丑陋的。
- [--] 潜在的错误来源。