bad*_*ash 6 c++ function-templates
我正在阅读C++模板完整指南,并遇到了这个非类型函数模板参数代码(我添加了main()和除函数定义和调用之外的其他部分):
#include <vector>
#include <algorithm>
#include <iostream>
template <typename T, int value>
T add (T const & element){
return element + value;
}
int main() {
int a[] = {1,2,3,4};
int length = sizeof (a) / sizeof (*a);
int b[length];
std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why?
std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; });
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从书中读到为什么我们需要对函数调用进行类型转换后我才明白?
编辑:书中的解释:
add是一个函数模板,函数模板被认为是一组重载函数(即使集合只有一个成员).但是,根据当前标准,多组重载函数不能用于模板参数推导.因此,您必须转换为函数模板参数的确切类型:...
编译器:Ubuntu 10.10上的g ++ 4.5.1
严格地说,您不能通过简单地给出模板参数列表来引用函数模板的特化.您总是必须有一个目标类型(比如,传递给的函数参数类型,或者您转换为的转换类型,或者您指定的变量类型).
例如,即使目标类型完全没有模板参数,情况也是如此
template<typename T> void f() { }
template<typename T> void g(T) { }
int main() {
g(f<int>); // not strictly valid in C++03
g((void(*)())f<int>); // valid in C++03
}
Run Code Online (Sandbox Code Playgroud)
委员会添加了C++ 0x中采用的规则和C++ 03模式中的流行编译器,如果你提供一个完整的模板参数列表,提供所有模板参数的类型,以及所有模板参数,就可以省略目标类型.默认模板参数.