在C ++模板中省略参数

时间:2009-07-17 22:55:47

标签: c++ templates

调用模板函数时,可以省略函数名后面的类型吗?

例如,考虑函数

  

模板<typename T&GT; void f(T var){...};

可以简单地这样称呼它:

  

int x = 5;
  F(X);

或我 包含类型?

  

int x = 5;
  ˚F<int&GT;(X);

2 个答案:

答案 0 :(得分:17)

每当编译器可以从函数参数中推断模板参数时,可以将它们遗漏掉。这也是一种很好的做法,因为它可以使您的代码更易于阅读。

此外,您只能保留结尾的模板参数,而不是开头或中间:

template<typename T, typename U> void f(T t) {}
template<typename T, typename U> void g(U u) {}

int main() {
    f<int>(5);      // NOT LEGAL
    f<int, int>(5); // LEGAL

    g<int>(5);      // LEGAL
    g<int, int>(5); // LEGAL

    return 0;
}

答案 1 :(得分:10)

使用隐式模板参数调用它没有任何问题。编译器会告诉您是否混淆,在这种情况下,您可能必须明确定义模板参数才能调用该函数。