【问题标题】:Template specialization for two types两种类型的模板特化
【发布时间】:2013-02-26 16:26:21
【问题描述】:

我的类模板AnimCurve 中有一个静态成员函数lerp(),我想专门用于四元数,这样:

template<>
inline Quatf AnimCurve<Quatf>::lerp( 
    const Quatf& start, 
    const Quatf& end, 
    float time 
    )
{
    return start.slerp(time, end);
}

但是,这还不够通用,因为还可以使用Quatd。由于QuatfQuatd 都是Quaternion&lt;T&gt; 的类型定义,是否可以编写一个对两者都适用的函数?

这是AnimCurve的当前定义:

template< typename T >
class AnimCurve {
public:
    AnimCurve() {}
    void addKeyframe(float time, T value);
    T getvalue(float time) const;
private:
    static inline T lerp( const T& start, const T& end, float time );
    std::map<float, T> mKeyframes;
};

【问题讨论】:

  • 你说你有一个“通用 lerp 函数”,但你的代码似乎表明它实际上是一个模板类 AnimCurve。您能否确认这一点(也许通过发布lerp 的声明)?
  • 另一个问题,只是为了确定:您希望您的专长用于所有 Quaternions,还是只用于QuatfQuatd?跨度>
  • @LucTouraille 两者兼而有之。另外,类 AnimCurve 确实是一个模板,我的 lerp 函数的声明在我的问题的第一行。

标签: c++ templates c++11


【解决方案1】:

是否可以编写一个对两者都适用的函数,因为 Quatf 和 Quatd 都是四元数的类型定义?

如果您想将 lerp 算法专门化为 完全 Quaternion 类模板的这两个实例化,而不是其他实例化,那么不,您必须明确专门化它们两个:一次用于AnimCurve&lt;Quatf&gt;,一次用于AnimCurve&lt;Quatd&gt;

【讨论】:

  • 我可以看到Quaternion&lt;Q&gt;Quatf 这让我很困惑!
  • @Nawaz:是的,现在我看了,不清楚这是函数模板还是类模板的成员函数。需要澄清一下
  • 它是一个成员函数,属于 AnimCurve 类。
  • @num3ric: 你能把AnmiCurve的定义贴出来吗?
猜你喜欢
  • 2019-08-20
  • 2013-07-11
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多