gpt4 book ai didi

c++ - 重载方法的类接受模板和基类 - 如何默认某个方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:55 24 4
gpt4 key购买 nike

我正在使用奇怪的循环模板模式来解决 C++ 中的问题。在某些使用相同方法的情况下,我需要返回一个子类或基类。

因此方法 dec 应该是这样的

base& get() {
return base_ref || deriv_ref; //depends on impl
}

虽然我还有其他方法比如

template <typename deriv> 
class base {

void run(deriv& d) {//deriv specific method/derived class/}
void run(base& b) { //base specific method// }
}

然而,每当我返回一个派生类(被重新解释为一个base&)时,方法默认为base类实现,如下所示.

template<typename d>
struct base {

void run(d& type) {
std::cout << "deriv " << std::endl;
}
void run(base& type) {
std::cout << "base" << std::endl;
}
base& alter(d& der) {
return der;
}
d& no_alt(d& der) {
return der;
}
};
struct deriv : public base<deriv> {

};
int main() {
deriv foo;
base<deriv> bar;
bar.run(foo); //prints deriv
bar.run(bar); //print base
bar.run(bar.alter(foo));//print base (Need this to print deriv)
bar.run(bar.no_alt(foo));//print deriv

}

在这些实例中,如何让方法默认为 derived_methods

此外,我认为编译器应该给出定义不明确的警告(因为它基本上有两个接受相同类型的方法)。

最佳答案

alter 返回类型 base&。这意味着语句 bar.run(bar.alter(foo)); 将评估 bar.alter(foo),返回对 foo< 的引用 转换为 base&。然后,使用该 base& 引用调用 bar.run()

您没有收到警告,因为您为函数提供了 base&,并且只有一个重载采用 base&。如果您希望此特定代码调用 runderiv& 重载,您需要将 base& 重载更改为如下内容:

void run(base& type) {
deriv* derivTest = dynamic_cast<deriv*>(&type);
if( derivTest != nullptr )
run(*derivTest);
else
std::cout << "base" << std::endl;
}

这会检查传入的引用是否真的是对 deriv 的引用,并在需要时调用正确的 run。请注意,在 dynamic_cast 失败的情况下,通过指针类型可以防止异常。

关于c++ - 重载方法的类接受模板和基类 - 如何默认某个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46721975/

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