我见过这样的代码:
#include <iostream>
// member_function_templates.cpp
struct X
{
template <class T> void mf(T* t) {
std::cout << "in mf t is: " << *t << std::endl;
}
};
int main()
{
int i = 5;
X* x = new X();
x->mf(&i); //why can this be called without specifying a type as in: x->mf<int>(&i) ??
}
我的问题在 main 的评论中。为什么可以调用:
x->mf(&i);
...没有指定类型?直觉告诉我们应该这样称呼:
x->mf<int>(&i);
...但显然不必像这样调用(以上两种方式对我来说都是用 gcc 4.7 编译的 - 没有明确指定模板。)
而且,如果您调用它时没有为模板指定类型,那么 T 的类型是什么(在模板函数定义中)? (我猜它默认为你作为参数传递给函数 mf 的任何类型,但进一步解释它是如何工作的会很好)
最佳答案
这是模板类型推导,它适用于所有模板函数,而不仅仅是非模板类的成员。基本上,编译器能够从函数的参数中推断出(遵循标准中的一组规则)T
类型的含义。当编译器看到对 mf(&i);
的调用时,它知道 i
是一个 int
,所以参数是一个 int*
这意味着您需要具有 T==int
(*)
如果你想强制模板的特定特化,你仍然可以提供一组特定的模板参数。例如,如果您希望模板的参数不是推导的参数,而是可以从它转换的参数:
template<typename T>
void foo(T arg) {...}
int i = 10;
foo(i); // calls foo<int>(i)
foo<double>(i); // calls foo<double>(static_cast<double>(i))
(*) 它比这稍微复杂一些,因为可能存在参数有效的多个 T
类型,但是语言中的规则确定将推导 的特定T
。在本例中,它是 int
。
关于c++ - 非模板化结构/类的模板化成员函数 - 默认类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882270/