gpt4 book ai didi

C++:覆盖从模板类派生的虚拟纯函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:48 25 4
gpt4 key购买 nike

我根据描述的这种出色的访问者模式编写了一些类 here (我的实现有点不同)。

template<typename... Types>
class Visitable {
public:
virtual void accept(Visitor<Types...>& visitor) = 0;
};

class MyClass : public Visitable<int, string>
{
virtual void accept(Visitor<int, string>& visitor)
{
/*** my code ***/
}
};

上面的代码有效,但我想像这样实现 MyClass:

class MyClass : public Visitable<int, string>
{
template<typename... Types>
virtual void accept(Visitor<Types...>& visitor)
{
/*** my code ***/
}
};

显然,我更改了对 accept 方法的调用,但出现此错误:“无法实例化抽象类”。为什么在第二种情况下,accept() 没有被覆盖? MyClass 应该模板化吗?

谢谢。

最佳答案

使用 CRTP:

template<class D, class...Ts>
struct Visitable_CRTP : public Visitable<Ts...> {
virtual void accept(Visitor<Ts...>& visitor) override final {
return static_cast<D*>(this)->accept_impl(visitor);
}
};
class MyClass : public Visitable_CRTP<MyClass, int, string>
{
template<typename... Types>
void accept_impl(Visitor<Types...>& visitor) // not virtual
{
/*** my code ***/
}
};

Visitor_CRTP 编写将 virtual accept 附加到您的 template accept_impl 的粘合代码。

如果你想有多个accept方法,我们可以这样做:

template<class D, class...Visitables>
struct PolyVisitable_CRTP {};

template<class D, class...V0, class...Vs>
struct PolyVisitable_CRTP<D, Visitable<V0...>, Vs...>
Visitable_CRTP<D, V0...>,
PolyVisitable_CRTP<D, Vs...>
{};

可以这样使用:

class MyClass :
public PolyVisitable_CRTP<MyClass,
Visitable<int,double>,
Visitable<std::string, char, wchar_t>,
Visitable<>
>
{
template<typename... Types>
void accept_impl(Visitor<Types...>& visitor)
{
/*** my code ***/
}
};

并且所有 Visitable 碱基的 accept 都将被路由到 accept_impl

代码未经测试或编译,可能包含 tpyos。

关于C++:覆盖从模板类派生的虚拟纯函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40729048/

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