将参数添加到公共模板

问题描述:

我有一个模板化的API函数,看起来像这样:将参数添加到公共模板

template<typename funcT, class T> int funcProperties(
    T  func, 
    funcT extract, 
    int limit = 0); 

现在我想一个标志参数添加到该模板。我应该添加一个新的模板,还是我可以简单地将标志添加到现有的API,然后发布它?

新的API应该是这样的:

template<typename funcT, class T> int funcProperties(
    T  func, 
    funcT extract, 
    int  limit = 0, 
    unsigned flags = 0); 

答案取决于具体情况:

  • 你正在建设一个图书馆与你的API和您的客户与它连接

  • 或者您将运送API作为源代码并且您的客户编译它

在第一种情况下,为了让库包含函数模板的实例,您可能会明确地实例化它。如果您使用extern "C"导出,那么您的导出只能导出一个实例,因此它将起作用。如果不是,那么funcProperties函数的每个实例都会名称被破坏(请参阅Name Mangling),并且它们中的每一个都将包含所有模板参数。所以导出的名称会改变。因此,在这种情况下,您的客户将不得不携带新的头文件并重新编译并链接其解决方案。在这种情况下,如果添加其他版本,它们可能会更方便。

在第二种情况下它应该工作 - 当你的客户端将重新编译他们的代码时,模板将被简单地实例化为最后一个模板参数的默认值。