struct Thing
{
} ;
template <typename T> struct VertexWriter : public Thing
{
template <typename S>
bool intersects( S* otherThing )
{
// has a body, returns T or F
}
} ;
struct Rocket : VertexWriter<VertexPNCT>
{
template <typename S>
bool intersects( S* otherThing ) ; // WANTS TO OVERRIDE
// implementation in VertexWriter<T>
} ;
但是Rocket
指定它是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函数。如果派生类重写它,它将使用重写,但否则它将返回默认值。注意,这确实会使您的类层次结构变得复杂,但可能会达到您所期望的目的。
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案
我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?
关于下一个代码,我有一些问题: > 类专业化
这个问题可能太难在标题中的on句子中描述,但这里有一个最小的例子: 当两种类型相同时 当这两种类型是同一类型的类模板的实例化时 天真地说,我们希望第二个部分专门化不会与第一个不明确,因为它感觉“更专门化”,对基础模板上和的推导类型施加更多限制。然而,主要的编译器似乎同意我们的期望是错误的:为什么它不被认为是更专业化的?
我有一个模板基类,其模板参数类型为bool。此基类的构造函数参数列表取决于模板参数是true还是false。我想从这个类派生另一个模板类,它的模板参数是任意类型的。我需要这个派生类根据该类型的特征调用该基类的正确构造函数。 下面的例子并不包罗万象。无论是否为整数,基类模板bool可以是任何类型trait。此外,传递给派生类的模板参数的类型可以是任何类型。
我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。