多个强制转换规则C ++

时间:2016-10-23 01:55:46

标签: c++ templates

在以下代码中,

    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; 
    } 

感谢。

1 个答案:

答案 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&),因此它会知道要选择哪个模板。