c++ - 非模板化结构/类的模板化成员函数 - 默认类型是什么?

标签 c++

我见过这样的代码:

#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/

相关文章:

python - Git:保持同一文件的两个位置同步

c++ - 抛出异常...访问冲突读取位置

c++ - 将 std:set<int32_t> 复制到 std::set<uint32_t> 的好方法

c++ - 处理大量的浮点矩阵

c++ - 这个 C++ 语法的含义是什么

c++ - 重置 boost 累加器 C++

c++ - 无法在 QAbstractItemModel 的 dataChanged 信号槽中获取发送者对象

C++ 元编程自动创建函数?

c++ - 如何将 double vector 传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

c++ - .h 文件中的全局常量,将问题与 gcc 联系起来,适用于 g++