我对模板的概念略感混淆.即如果你有这样的功能:
template<typename T>
void DoubleValue(T ¶m)
{
param *= 2;
}
Run Code Online (Sandbox Code Playgroud)
编译器如何知道允许哪些类型传递给此函数?如果代码使用该类型,它是否使用所有已知类型进行测试?这有性能问题吗?
与Java或C#中的泛型相反(其中类型参数的行为类似于boost::any编译器安全的运行时检查void*),[类/函数]模板不是[类/函数].它用于在实例化时生成ad-hoc [类/函数] (不要与对象实例化混淆).
实例化可以是显式的:
// Hey compiler, please generate code for DoubleValue<int>.
template void DoubleValue<int>(int ¶m);
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)
所有这些都是在编译时完成的.