gpt4 book ai didi

c++ - 继承和模板函数c++

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:19 25 4
gpt4 key购买 nike

我想知道是否有继承模板函数的模式/方法?模板函数不能是虚拟的,所以如果我的基类有一个模板函数并且我的派生类有相同的模板函数,那么在下面的例子中将始终调用基类的函数:

struct Base {
Base() {}
template < typename T >
void do_something(T& t) const {
t << "Base" << std::endl ;
}
};

struct Foo : Base {
Foo() : Base () {}
template < typename T >
void do_something(T& t) const {
t << "Foo" << std::endl ;
}
};

struct Bar : Foo {
Bar() : Foo() {}
template < typename T >
void do_something(T& t) const {
t << "Bar" << std::endl ;
}
};


int main(int argc, char** argv)
{

Base *b = new Base() ;
Base *f = new Foo() ;
Base *ba = new Bar() ;

b->do_something(std::cout) ;
f->do_something(std::cout) ;
ba->do_something(std::cout) ;

return 0 ;
}

所以这个程序总是打印:

Base
Base
Base

有没有办法让我的程序打印:

Base
Foo
Bar

实际上,我发现这样做的唯一方法是制作一个 static_cast :

...
static_cast<Foo*>(f)->do_something(std::cout) ;
static_cast<Bar*>(ba)->do_something(std::cout) ;
...

是否有任何模式或优雅的方式来封装转换,以便在函数调用中不会引起注意?感谢您的回复

最佳答案

您几乎总是可以通过将功能拆分成更小的部分来做您需要的事情,必要时使每个部分模板化,或必要时虚拟化。在这个例子中,这很简单:

struct Base {
Base() {}
template < typename T >
void do_something(T& t) const {
t << something_piece() << std::endl ;
}
virtual const char* something_piece() const {
return "Base";
}
};

struct Foo : Base {
Foo() : Base () {}
const char* something_piece() const {
return "Foo";
}
};

struct Bar : Foo {
Bar() : Foo() {}
const char* something_piece() const {
return "Bar";
}
};

它可能比这更复杂,但这个想法在结合编译时和运行时差异方面非常强大。

关于c++ - 继承和模板函数c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623354/

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