gpt4 book ai didi

c++ - 编写专门用于类及其子类的函数模板

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:34 25 4
gpt4 key购买 nike

我正在尝试编写一个函数模板。一个版本应该用于所有不满足另一个版本标准的类型;当参数是给定类的基类或该类本身时,应使用另一个版本。

我曾尝试对 Base& 进行重载,但是当类派生自 Base 时,它们使用通用类,而不是特定类。

我也尝试过这种 SFINAE 方法:

struct Base { };

struct Derived : public Base { };

struct Unrelated { };

template<typename T>
void f(const T& a, bool b = true) {
cout << "not special" << endl;
}

template<typename T>
void f(const Base& t, bool b = is_base_of<Base, T>::value) {
cout << "special" << endl;
}

Base b;
Derived d;
Unrelated u;

f(b); f(d); f(u);

但是都打印“not special”。我不擅长 SFINAE,我可能只是做错了。我该如何编写这样的函数?

最佳答案

首先,这些都不会称为“特殊”f过载因为 T不能从函数参数中推导出来。它的第一个参数需要是 T 类型:

void f(const T& t, bool b = is_base_of<Base, T>::value)

一旦完成,请注意“特殊”重载并没有真正使用 SFINAE 来影响重载解析:is_base_of<T, U>::value总是有一个值:它是 truefalse .要影响重载决议,您需要使用 enable_if ,它有条件地定义了一个基于 bool 值的类型。

此外,两个重载都需要使用 SFINAE:如果 T,则必须启用“特殊”重载派生自基础(或者是基础类型),并且只有在 T 时才必须启用“非特殊”重载不是派生自基类,否则会出现重载解析歧义。

这两个重载应该被声明和定义为:

template<typename T>
void f(T const& a, typename enable_if<!is_base_of<Base, T>::value>::type* = 0)
{
cout << "not special" << endl;
}

template<typename T>
void f(T const& t, typename enable_if<is_base_of<Base, T>::value>::type* = 0)
{
cout << "special" << endl;
}

最后,请注意这里没有特化。这两个函数名为 f重载

关于c++ - 编写专门用于类及其子类的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124046/

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