gpt4 book ai didi

c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?

转载 作者:可可西里 更新时间:2023-11-01 15:52:45 26 4
gpt4 key购买 nike

使用 VC++ 2010,给出以下条件:

class Base { };
class Derived : public Base { };

template<class T> void foo(T& t); // A
void foo(Base& base); // B

Derived d;
foo(d); // calls A
foo(static_cast<Base&>(d)); // calls B

我想在上面调用“B”。我可以通过转换为 Base 来实现这一点,但为什么这是必要的?

我希望为所有不是从 Base 派生的类型(内置类型等)调用模板函数,但我希望为从派生的类型调用非模板重载Base,无需客户端显式转换。我也尝试过使重载成为模板的特化,但在这种情况下会发生相同的行为。获得所需内容的惯用方法是什么?

最佳答案

在所有条件相同的情况下,非模板函数优于函数模板。但是,在您的场景中,并非所有情况都相同:(A) 与 T = Derived 完全匹配,但 (B) 需要对参数进行派生到基础的转换。

对于特定情况(如本例),您可以通过使用 SFINAE(替换失败不是错误)来解决此问题,以防止 (A) 使用派生自 Base 的类型进行实例化:

#include <type_traits>
#include <utility>

template <typename T>
typename std::enable_if<
!std::is_base_of<Base, T>::value
>::type foo(T& x)
{
}

void foo(Base& x)
{
}

关于c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594326/

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