【发布时间】:2025-08-13 07:20:01
【问题描述】:
我有一个 C++ 代码,我在其中比较了从一个共同的母类 Foo 派生的不同类。如果两个类的类型不同,则比较总是false。否则,它会比较特定于类的一些内部数据。
我的代码如下所示:
class Bar;
class Baz;
class Foo
{
public:
virtual bool isSame( Foo* ) = 0;
virtual bool isSameSpecific( Bar* ){ return false; }
virtual bool isSameSpecific( Baz* ){ return false; }
};
class Bar : public Foo
{
public:
bool isSame( Foo* foo){ return foo->isSameSpecific(this); }
bool isSameSpecific( Bar* bar){ return bar->identifier == identifier; }
int identifier;
};
// and the same for Baz...
这很好用(我认为这是双重调度),我可以将 Bar 和 Baz 与仅指向 Foo 的指针进行比较。
但现在问题来了。我必须添加一个模板类:
template< typename T>
class Qux : public Foo
{
//...
};
问题是在Foo 中,我不能为Qux* 声明方法isSameSpecific,因为它是虚拟的和模板的。
问题:有什么巧妙的方法可以解决这个问题吗?
【问题讨论】:
-
也只制作
Foo类模板,或者为所有需要的Qux<T>编写不同的isSameSpecific重载。 -
@ForEveR 感谢您的评论!模板参数在 Foo 上没有意义,未来类可能有其他模板参数,所以我不想在 Foo 上得到所有可能的模板参数。对于不同的重载,这可能是一个可接受的解决方案,但 T 可能有很多可能性,所以要编写这么多重载(不是很整洁)。
-
看看 Andrei Alexandrescu 的 Loki Library,尤其是 Visitor 模式。
-
@PeterWood 有意思,我去看看!
标签: c++ templates double-dispatch