gpt4 book ai didi

c++ - 如何强制编译器选择特定的函数特化

转载 作者:行者123 更新时间:2023-11-30 04:05:42 24 4
gpt4 key购买 nike

例如,我有两个类:

class Foo {
public:
const bool operator==(const Foo&) const;

template<class _Ty>
const bool operator==(const _Ty&) const;
};

class Bar : public Foo { };

像这样的代码:

Foo& foo;
Bar& bar;

const bool equality = (foo == bar);

显然,编译器会选择模板函数来计算这个表达式,因为变量 bar 需要转换为 Foo& 才能调用专门的 operator==。但是有什么方法可以强制编译器(不将 Bar& 转换为 Foo&)在参数是从 Foo 派生的类(例如添加/删除一些修饰符或其他东西)?

最佳答案

Is there any way how I can force a compiler (without casting Bar& into Foo&) to choose the specialization firstly instead of the template function when the argument is an instance of a class derived from Foo?

是的,你可以,使用类型特征。具体可以用std::enable_ifstd::is_base_of如下:

template<typename Type>
typename std::enable_if<
std::is_base_of<Foo, Type>::value,
const bool
>::type
operator==(const Type&) const { … }

template<typename Type>
typename std::enable_if<
!std::is_base_of<Foo, Type>::value,
const bool
>::type
operator==(const Type&) const { … }

Live demo

您基本上是根据模板参数激活/停用重载。

您还可以通过添加别名使内容略微更具可读性:

template<class Type>
using is_fooable = std::is_base_of<Foo, Type>;

Live demo

关于c++ - 如何强制编译器选择特定的函数特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162794/

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