繁体   English   中英

模板参数推导和指向常量的指针

[英]Template argument deduction and pointers to constants

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

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&更专业T&我预计Foo_p将被调用。

任何人都可以向我指出一个很好的资源,其中列出了模板参数推导规则和匹配的优先级。

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

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

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<...>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已经这样做了)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM