我想知道是否有继承模板功能的模式/方法? 模板函数不能是虚拟的,所以如果我的基类有一个模板函数而且我的派生类有相同的函数,那么在下面的例子中将始终调用基类的函数:
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) ;
...
是否有任何模式或优雅方式来封装演员表,以便从函数调用中无法察觉? 谢谢你的回复
答案 0 :(得分:2)
通过将函数拆分为较小的部分,使每个部分在必要时进行模板化,或者必要时进行虚拟化,您几乎总能做到所需。在这个例子中,这很简单:
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";
}
};
它可能会变得更复杂,但这个想法在结合编译时和运行时差异方面非常强大。
答案 1 :(得分:0)
您是否可以选择将结构更改为模板类而不是模板方法?
如果是这样的话:
Template<typename T>
struct Base
{
public:
virtual void doSomething();
};
Template<typename T>
struct Foo : Base<T>
{
public:
virtual void doSomething();
};