2

有时我想重载或专门化由于循环依赖而早先已调用的模板。

由于它们是模板,解决方案通常是拆分声明和定义。

但是,如果这些模板是#included 库的一部分,这意味着您需要两个#include:

  • 一个用于声明,必须所有专业之前。
  • 一个用于“后期”定义,毕竟它必须是专业化的。

(删除的 C++导出关键字(C++11 之前)是一个潜在的解决方案,但它有很多问题)。

有没有人有任何解决方案来避免需要第二个#include?


我考虑过:

  1. 尝试制作某种单一的“late_call”转发模板函数,该函数在源代码末尾定义,并使用某种机制从其参数中推断出目标函数。不幸的是,我只能看到这在非常特殊的情况下是如何工作的。

    • [--] 大部分都行不通。
    • [-] 在源代码末尾需要一个#include。
  2. 通过预处理器创建要包含的可扩展标头列表,然后通过单个最终#include 将它们全部包含在最后。使用大量#defines 可以破解这样一个具有固定数量位置的列表。

    • [-] 人为限制。
    • [-] 使用宏#includes,它搞砸了一些工具。
    • [-] 丑得要命。
    • [-] 在源代码末尾需要一个#include。
  3. 创建我自己的手动 pragma-type 命令,然后编写一个外部工具来运行预处理代码并在编译之前移动内容。

    • [+] 完美运行。
    • [+] 不需要在源代码末尾添加任何内容。
    • [--] 这几乎可以确保没有人会想要使用我的库,而且我自己也可能会讨厌它。
  4. 创建一个“late.hpp”,在其中我为每个后期定义添加#includes,由#ifdefs 保护以检查是否需要它们。

    • [-] 在源代码末尾需要一个#include。
    • [--] 完全打破模块化。
  5. 在末尾手动添加后期定义标题列表。

    • [--] 打破模块化。如果其他实现发生变化,源文件可能会间接获得新的后期定义要求。
    • [-] 丑陋的。
    • [--] 潜在的错误来源。
4

0 回答 0