用于分隔C ++模板函数的声明和定义的正确格式

时间:2014-06-02 18:35:05

标签: c++ templates language-lawyer

我使用此方法http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html将C ++模板函数的定义与其声明分开,以避免使用代码混乱我的头文件。

该链接使用一个没有参数或返回的函数作为示例,但假设我有一个带参数的函数。该链接将建议以下安排:

// File "f.h" 
template <typename T> void f(T t);

// File "f.cpp"
#include "f.h"

template <typename T> void f(T t) {
  // do something
}

template void f<int>(int t);
// other specializations as needed

然而,如果省略尖括号中的类型,似乎专门化也有效,因为我认为编译器从参数类型推导出它:

template void f(int t);

但我想知道,这样做有效吗?

Visual C ++ 12(2013)

1 个答案:

答案 0 :(得分:10)

是的,这是有效的。 [temp.explicit] p3说:

  

如果显式实例化是针对函数或成员函数,则不合格 -   声明中的id 应为 template-id ,或者,如果可以推导出所有模板参数,则 template-name operator-function-id

你的函数有一个模板参数,它可以从函数参数中推导出来,当函数参数为int时,模板参数可以推导为int,这样你就可以(可选)使用 template-name f,而不是 template-id f<int>