在以下代码中,
std::transform (source.begin(), source.end(), // start and end of source
dest.begin(), // start of destination
(int(*)(int const&)) addValue<int,5>); // operation
有人可以分解演员,
(int(*)(int const&))
其中addValue为非类型函数模板,为
template <typename T, int VAL>
T addValue (T const& x)
{
return x + VAL;
}
感谢。
答案 0 :(得分:4)
广播(int(*)(int const&))
是对int(*)(int const&)
类型的强制转换,类型为&#34;指向函数的int const&
并返回int
&#34;
由于addValue<int, 5>
已经具有类型&#34;功能,需要int const&
并返回int
&#34; (并且在按值传递时会衰减到函数指针),在此上下文中不需要强制转换。
这种演员何时有用的一个例子是消除多个具有相同名称的功能模板之间的歧义。如果除了显示的addValue
定义之外,我们还有:
template <typename T, int VAL>
void addValue(T& x) {
x += VAL;
}
然后单独指定addValue<int, 5>
将是不明确的。告诉编译器实例化后应该具有addValue
类型的类型会告诉它使用int addValue<int, 5>(int const&)
而不是void addValue<int, 5>(int&)
,因此它会知道要选择哪个模板。