将参数添加到公共模板

时间:2014-09-25 23:34:39

标签: c++ api templates

我有一个模板化的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);

1 个答案:

答案 0 :(得分:0)

答案取决于具体案例:

  • 您正在使用API​​构建库,并且您的客户端与之链接

  • 或者您将API作为源代码发送,并且您的客户端将其编译为

在第一种情况下,为了使库包含函数模板的实例化,您可以显式地实例化它。如果您使用extern "C"导出,则导出只能导出一个实例,以便它可以正常工作。如果没有,则funcProperties函数的每个实例化都会将其名称损坏(请参阅Name Mangling),并且每个实例都将包含所有模板参数。因此导出的名称将会更改。因此,在这种情况下,您的客户端必须采用新的头文件并重新编译并链接其解决方案。在这种情况下,如果添加其他版本,它们可能会更方便。

在第二种情况下,它应该可以工作 - 当您的客户端将重新编译其代码时,模板将仅使用最后一个模板参数的默认值进行实例化。