是否可以将模板生成的函数作为f()和f <t>()?</t>

时间:2014-01-27 11:28:22

标签: c++ c++11

是否可以将模板生成的函数设为f()f<T>()

我想在大多数情况下使用指定的类型调用f,例如:

f<string>();
f<int>();

但我也需要这样称呼它:

f();

和未指定的类型应该是字符串。这可能吗?

3 个答案:

答案 0 :(得分:9)

template <typename T>
void f() { ... }

void f() { f<string>(); }

答案 1 :(得分:8)

您可以为模板参数指定默认类型:

template<class T=std::string>
foo()

注意:如果为模板类提供默认参数,则必须使用Foo<>声明默认版本。调用模板化函数时不需要这样做;您可以调用不带尖括号的默认版本:foo()

另一个注意事项:由于模板参数推断,这适用于函数。引用标准(2012年1月草案§14.8.2.5)强调我的:

  

使用得到的替换和调整的函数类型作为   模板参数推导的函数模板的类型。 如果是   模板参数尚未推断,其默认模板参数,   如果有的话,使用。 [例如:

template <class T, class U = double>
void f(T t = 0, U u = 0);
void g() {
    f(1, ’c’);     //f<int,char>(1,’c’)
    f(1);          //f<int,double>(1,0)
    f();           //error: T cannot be deduced
    f<int>();      //f<int,double>(0,0)
    f<int,char>(); //f<int,char>(0,0)
}

答案 2 :(得分:2)

#include <string>

template <typename T=std::string>
void f() {}

int main()
{
  f();
}