使用模板时实际发生了什么?

Kie*_*son 3 c++ templates

我对模板的概念略感混淆.即如果你有这样的功能:

template<typename T>
void DoubleValue(T &param)
{
    param *= 2;
}
Run Code Online (Sandbox Code Playgroud)

编译器如何知道允许哪些类型传递给此函数?如果代码使用该类型,它是否使用所有已知类型进行测试?这有性能问题吗?

Que*_*tin 9

与Java或C#中的泛型相反(其中类型参数的行为类似于boost::any编译器安全的运行时检查void*),[类/函数]模板不是[类/函数].它用于在实例化时生成ad-hoc [类/函数] (不要与对象实例化混淆).

实例化可以是显式的:

// Hey compiler, please generate code for DoubleValue<int>.
template void DoubleValue<int>(int &param);
Run Code Online (Sandbox Code Playgroud)

......或隐含的:

int main() {
    // Hey compiler, I want to call DoubleValue<float>.
    // Please generate the code if it's not done already.
    return DoubleValue(1.5f);
}
Run Code Online (Sandbox Code Playgroud)

所有这些都是在编译时完成的.