gpt4 book ai didi

c++ - 双重分派(dispatch)和模板类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:46 33 4
gpt4 key购买 nike

我有一个 C++ 代码,我在其中比较从一个公共(public)母类派生的不同类,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...

这很好用(我认为这是双重 dispatch ),我可以比较 BarBaz只有指向 Foo 的指针.

但是现在问题来了。我必须添加一个模板类:

template< typename T>
class Qux : public Foo
{
//...
};

问题是在Foo ,我无法声明方法 isSameSpecific对于 Qux* ,因为它将是虚拟的和模板的。

问题:有什么巧妙的方法可以克服这个问题吗?

最佳答案

这个问题并没有真正的解决方案:你需要一个isSameSpecific函数的每个实例化您使用的模板。 (换句话说,在 Foo 中:

template <typename T>
virtual bool isSameSpecific( Qux<T>* );

是非法的,但是:

virtual bool isSameSpecific( Qux<int>* );
virtual bool isSameSpecific( Qux<double>* );
// etc.

不是。)

您也许可以创建一个摘要 QuxBase ,并且有 Qux<T>从中得出。最有可能的,那只会将问题转移到QuxBase , 但如果 isSameSpecific不依赖于 T 的类型, 例如因为您可以定义一些规范的包含类型,所以它可能是可行的。不知道更多关于 QuxisSameSpecific ,很难说。 (如果 Qux<T>::isSameSpecific应该总是返回 false如果实例化类型不同,例如,您可以键入打卡QuxBase::isSameSpecific , 并转发给另一个如果类型相同则为虚函数。)

请注意,类似的问题会影响所有替代方法也实现多重分派(dispatch)。最后,你是要求通过一组开放的类型进行调度,这意味着可能有无限数量的不同功能。

编辑:

需要说明的是:我假设您的 isSame只是一个例如,实际操作可能更复杂。您显示的实际代码显然符合我的建议第二段;事实上,它甚至可以实现没有多次 dispatch 。只需定义一个规范的“标识符”类型,定义一个虚拟 getCanonicalIdentifier功能,和在 isSame 中使用它:

bool Foo::isSame( Foo const* other ) const
{
return getCanonicalIdentifier()
== other->getCanonicalIdentifier();
}

就此而言,如果不同的类型意味着 isSame返回 false(通常是这种情况,如果 isSame 表示它看起来的样子像),你也不需要双重调度:

bool Foo::isSame( Foo const* other ) const
{
return typeid( *this ) == typeid( *other )
&& isSameSpecific( other );
}

派生isSameSpecific将不得不转换的类型指针,但因为他们保证它是相同的作为 this 的类型,这是一个简单而安全的操作。

最后:如果类没有值语义(并且如果涉及多态性,几乎肯定不应该),像这样简单的东西:

bool Foo::isSame( Foo const* other ) const
{
return this == other;
}

可能就足够了。

所有这些适用于isSame之类的东西, 然而。如果您有其他功能受到影响,您回来了按照我最初所说的。

关于c++ - 双重分派(dispatch)和模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16186608/

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