3

我定义了两个重载函数,它们的声明如下

template <class T> void Foo(const T *p);    // lets call this Foo_p

template <class T> void Foo(const T& r);    // lets call this Foo_r

当我打电话

Foo( ptr_to_non_const );

Foo_r被调用。我假设在寻找最佳匹配时,不断的限定条件会从指针中删除。因为T*T&我预期的更专业,所以Foo_p会被调用。

谁能指出我列出模板参数推导规则和匹配优先级的好资源。

在这种特殊情况下,我打算template <class T> void Foo(const T& r)被称为非指针类型。这是否意味着我必须定义有条件和没有条件的功能const。对于一个参数来说,这没什么大不了的,但我的函数需要多个指针,所以我想避免重复。任何建议,将不胜感激。

4

1 回答 1

3

模板推演规则比较复杂,不知道有没有简单的总结。但是,如果两个模板是候选模板,其中一个需要转换而另一个不需要,则选择不需要转换来生成模板参数的一个。在您的示例中,匹配的实例如下:

S* ptr_to_non_const = ...;
Foo(ptr_to_non_const); // => candidates:
                       //   a. F(const T&) with `T` deduced as `S*` requires no
                       //      conversion
                       //   b. F(const T*) with `T` deduced as `S` requires `S*` to
                       //      `S const*` conversion

std::enable_if<...>要强制使用指针重载,您可以使用with 一起从重载集中删除引用版本std::is_pointer<...>

template <class T>
typename std::enable_if<!std::is_pointer<T>::value>::type
Foo(const T& r);

虽然这使用了 C++ 2011 的特性,但两者都std::enable_if<...>可以std::is_pointer<...>使用 C++ 2003 编译器很容易地实现(而且我很确定Boost已经这样做了)。

于 2012-12-02T02:01:43.187 回答