我想知道解决以下问题的最有效(关于速度)的方法:
假设我们有一个类AFoo
,它有一个简单的头文件:
AFoo.h
class AFoo {
public:
double x;
//Additional methods/variables belonging only to AFoo
};
现在,我收到了一组我没有定义的类(即其他一些顽固的程序员正在创建这些类),它们都"共享"x
变量。我们可以想象,这样一个集合的一个成员是类BFoo
,它看起来像:
BFoo.h
class BFoo {
public:
double x;
//Additional methods/variables belonging only to BFoo
};
现在,我在某个地方有一个函数,它接受指向AFoo
的指针
void doSomething(AFoo *pnt){
//does operations with the x member only.
}
我真的希望我的doSomething
函数也接受一个指向BFoo
或给定集合的任何类的指针。把x
抽象成一个新的类Foo
是无法解决的,因为顽固的程序员拒绝从中继承。我曾想过使用模板函数,但不方便的是,每当顽固的程序员创建一个新类时,我都必须重新编译。
我的第一次尝试是定义一个行为如下的接口:
class AlternativeFoo {
public:
virtual double & getX() = 0;
};
这样我就可以定义另一个类,比如
class AlternativeAFoo: public AlternativeFoo{
public:
double & getX(){ return mPoint.x; };
private:
APoint mPoint;
};
现在,我可以更改doSomething
方法以接受指向AlternativeFoo
变量的指针,这很好。但是,这个解决方案明显比模板类慢。我是否缺少一种不会影响性能的设计模式?非常感谢!
编辑:作为这个问题的一个具体例子,假设我编写了一个库,我希望它与同一抽象思想的几个定义兼容,例如,一个具有坐标x和y的2D点。这些定义可以来自视频游戏设计软件或其他软件中的API,它们都有一个共同的事实,即它们将x
和y
坐标作为同一类型的成员变量。如何使一段代码与所有代码兼容?
您只需要一个在pnt->x
(或其他)上操作的模板。
即
template <typename AnyFoo>
void doSomething(AnyFoo * pnt)
{
pnt->x = 10;
}
如果您尝试doSomething("Something not a Foo e.g. a const char *")
,编译器会给您一条错误消息