【发布时间】:2014-05-06 18:02:19
【问题描述】:
假设我有一个基类,它存储了对一些 class Bar 的引用:
class FooBase
{
public:
FooBase( Bar &ctx ) : _barCtx( ctx ) {};
virtual ~FooBase() {};
// Some other functions
protected:
Bar &_barCtx;
};
我想做的是在此之上添加一个继承级别,class Foo<T> 将添加一些功能。
template< typename T >
class Foo : public FooBase
{
public:
Foo( Bar &ctx ) : FooBase( ctx ) {};
bool doSomething( int a );
};
然后,有一些Foo<T> 的实例需要提供不同版本的doSomething(),因此使用模板特化。问题是,在Foo<> 的每个专用版本中,我必须重新实现构造函数并将Bar 的引用传递给超类。这基本上是复制和粘贴代码,我想避免这种情况。
class Baz;
template<>
class Foo<Baz> : public FooBase
{
public:
Foob( Bar &ctx ) : FooBase( ctx ) {};
bool doSomething( std::string &str, int x, float g );
};
本练习的重点是提供具有不同签名的不同类型的doSomething()。那么,不使用 C++11(因为我被困在 GCC 4.6.3 上),有没有办法避免这种代码重复?或者,有没有更好的方法来提供不同的doSomething()?
【问题讨论】:
-
我想更好地了解您的问题。在这里解决
doSomething的不同签名有什么问题(在这种情况下,“它看起来不像鸭子”,就像使用模板时通常那样)。 -
是您唯一要避免重复构造函数的那一点吗?我问的原因是我认为你可以使用 CRTP,并在 FooBase 之上创建一个类,但额外的复杂性可能不值得。
-
是否可以将
doSomething设为非成员函数?那将绕过这个问题。 (显然,创建一个也称为doSomething的成员调用免费的doSomething是微不足道的) -
@MooingDuck:这里的问题是 FooBase 有一个对 Bar 的引用,这是 doSomething() 需要的。如果我要传递 Bar,它会添加到我试图避免的参数列表中。真正的问题在
doSomething()中有更多的参数,我上面贴的是它的简化版本。 -
@MarkP 你似乎试图避免一些通常不会在这里避免的事情。
标签: c++ templates template-specialization