gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:25:39 24 4
gpt4 key购买 nike

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

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 的函数资格。对于一个参数来说,这没什么大不了的,但是我的函数需要多个指针,所以我想避免重复。如有任何建议,我们将不胜感激。

最佳答案

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

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

关于c++ - 模板参数推导和指向常量的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13665574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com