gpt4 book ai didi

c++ - 你能模板化一个没有模板化的子类吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:03 25 4
gpt4 key购买 nike

这是我的情况:

基类,无模板类型:

struct Thing
{

} ;

模板化类,扩展那个基类

template <typename T> struct VertexWriter : public Thing
{
template <typename S>
bool intersects( S* otherThing )
{
// has a body, returns T or F
}
} ;

派生类,CONCRETE类型(无模板)

struct Rocket : VertexWriter<VertexPNCT>
{
template <typename S>
bool intersects( S* otherThing ) ; // WANTS TO OVERRIDE
// implementation in VertexWriter<T>
} ;

但是template typename<S> bool VertexWriter<T>::intersects不能标记为虚拟,因为它是模板类。

有许多类派生自 VertexWriter<VertexPNCT>特化,所以模板特化VertexWriter<VertexPNCT>行不通。

所以正常的做法是提供模板特化。

但是Rocket指定它是 VertexWriter<VertexPNCT> ,所以它不再是一个模板类。它可以专门化或覆盖 intersects好像它是一个虚函数?

最佳答案

不,正如您所说,您不能使用虚函数,这会提供运行时多态性。

也就是说,根据您在更改类布局方面的余地,您也许可以使用 CRTP 做一些事情。

template <typename T, typename Derived> struct VertexWriter : public Thing
{
template <typename S>
bool intersects( S* otherThing )
{
return static_cast<Derived*>(this)->insersects_impl(otherThing);
}

template<typename S>
bool insersects_impl( S* otherThing)
{
// Whatever
}
} ;

struct Rocket : VertexWriter<VertexPNCT, Rocket>
{
template <typename S>
bool intersects_impl( S* otherThing ) { ... } // WANTS TO OVERRIDE
// implementation in VertexWriter<T>
} ;

intersects 的基本实现简单地转发给 CRTP 函数。如果派生类覆盖它,它将使用覆盖,否则它将回退到默认值。请注意,这确实会使您的类层次结构复杂化,但可能会完成您正在寻找的内容。

关于c++ - 你能模板化一个没有模板化的子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509191/

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