我有一个模板化的API函数,如下所示:
template<typename funcT, class T> int funcProperties(
T func,
funcT extract,
int limit = 0);
现在我想在这个模板中添加一个flags参数。我是否应该添加一个新模板,或者我可以简单地将标志添加到现有API中并发送它吗?
新API应如下所示:
template<typename funcT, class T> int funcProperties(
T func,
funcT extract,
int limit = 0,
unsigned flags = 0);
答案 0 :(得分:0)
答案取决于具体案例:
您正在使用API构建库,并且您的客户端与之链接
或者您将API作为源代码发送,并且您的客户端将其编译为
在第一种情况下,为了使库包含函数模板的实例化,您可以显式地实例化它。如果您使用extern "C"
导出,则导出只能导出一个实例,以便它可以正常工作。如果没有,则funcProperties
函数的每个实例化都会将其名称损坏(请参阅Name Mangling),并且每个实例都将包含所有模板参数。因此导出的名称将会更改。因此,在这种情况下,您的客户端必须采用新的头文件并重新编译并链接其解决方案。在这种情况下,如果添加其他版本,它们可能会更方便。
在第二种情况下,它应该可以工作 - 当您的客户端将重新编译其代码时,模板将仅使用最后一个模板参数的默认值进行实例化。