gpt4 book ai didi

C++:扩展模板类

转载 作者:太空狗 更新时间:2023-10-29 21:01:40 28 4
gpt4 key购买 nike

我有以下内容:

template<typename T> class CVector3
{
CVector3<T> &normalize();
// more stuff
};

typedef CVector3<float> Vector3f;
typedef CVector3<double> Vector3d;

我基本上想添加一个方法 toPoint(),如果 T=float 则返回一个结构体 Point3f,如果 T=double 则返回一个结构体 Point3d。我尝试将两个 typedef 替换为:

class Vector3f: public CVector3<float>
{
Point3f toPoint() const;
};

class Vector3d: public CVector3<double>
{
Point3d toPoint() const;
};

然而,这不起作用,因为现在 normalize() 被破坏了:它不再返回一个 Vector3f,而是一个 CVector3 ,它与 Vector3f 不兼容,因为它实际上是基类。我可以为 normalize() 和基类中的任何其他公共(public)方法添加包装方法,但我不想这样做,因为这会使维护这些类变得乏味。

我还尝试将 typedef 放回原处并在模板定义之外添加:

template<>
Point3f CVector3<float>::toPoint() const;

template<>
Point3d CVector3<double>::toPoint() const;

这不会编译,因为 toPoint() 没有在模板定义中声明。由于返回类型 Point3f/Point3d,我无法将其放入。

我该怎么做?非常感谢任何帮助!

最佳答案

您可以使用特征样式辅助类。

template<typename T> CVectorTraits {};
template<> CVectorTraits<double> { typedef Point3d PointType; }
template<> CVectorTraits<float> { typedef Point3f PointType; }

template<typename T> class CVector3
{
CVector3<T> &normalize();
// more stuff
typename CVectorTraits<T>::PointType toPoint() const;
};

关于C++:扩展模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17616120/

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