c检查模板参数的嵌套typedef以获取其标量基类型

c检查模板参数的嵌套typedef以获取其标量基类型,第1张

概述考虑下面的指数平滑模板类.此类用于以指数方式平滑/过滤顺序数据(请参阅更新方法). Elemtype可能是一个向量,Floattype通常是一个标量.例如. ExponentialSmoother<Eigen::Vector2f, float> x(0.1, Vector2f(0.5, 0.5)); 在此示例中,可以避免第二个模板参数Floattype,因为Eigen的Matrix类包含嵌套的ty 考虑下面的指数平滑模板类.此类用于以指数方式平滑/过滤顺序数据(请参阅更新方法). Elemtype可能是一个向量,floattype通常是一个标量.例如.
ExponentialSmoother<Eigen::Vector2f,float> x(0.1,Vector2f(0.5,0.5));

在此示例中,可以避免第二个模板参数floattype,因为Eigen的Matrix类包含嵌套的typedef以获取标量基类型:

Vector2f::Scalar

将Elemtype和floatype实例化为浮点数以平滑一维数据也是合理的.在这种情况下,也可以跳过第二个模板参数.

template <class Elemtype,class floattype>class ExponentialSmoother{public:    // ctor    ExponentialSmoother(floattype Alpha,Elemtype& initial_estimate);    // getters    inline const Elemtype& getValue() const {return estimate_;}    inline const floattype getAlpha() const {return Alpha_;}    const Elemtype& update(const Elemtype& curr)    {       estimate_ = (Alpha_ * curr) + (((floattype)1-Alpha) * estimate_);       return estimate_;    }private:    Elemtype estimate_;    floattype Alpha_;  // smoothing factor within [0,1]}

现在我的问题是,只用一个模板参数(元素类型)实现ExponentialSmoother的“最优雅”解决方案是什么?
它应该与特征向量和矩阵一起使用,但也适用于浮点类型.

换句话说,是否可以检查Elemtype :: Scalar是否存在,如果不存在(即Elemtype是float还是double),将floattype定义为Elemtype?

一个类似的问题已被问到here.但我想知道最通用的解决方案是什么,例如,如果也应该支持STL向量.是否所有类型都需要相同的嵌套typedef(或具有一致命名的某些traits类)?

解决方法 你可以使用帮手.您提供的链接几乎包含解决方案:
template<class T,class R = voID>  struct enable_if_type{    typedef R type;};template<class E,class Enable = voID>struct GetfloatType{    typedef E type;};template<class E>struct GetfloatType<E,typename enable_if_type<typename E::Scalar>::type>{    typedef typename E::Scalar type;};

然后,在你的班上:

template <class Elemtype,class floattype = typename GetfloatType<Elemtype>::type>class ExponentialSmoother{    // ...};

此外,有了这个用户仍然可以手动提供他们的浮动类型.你可以看到它live.奖金:与C 03一起使用没有问题.

请注意,您可以添加更多GetfloatType的部分特化. Here is a live example.别忘了ElemType只能接受GetfloatType的一个特化,否则它将是不明确的(并导致编译器错误).

总结

以上是内存溢出为你收集整理的c检查模板参数的嵌套typedef以获取其标量基类型全部内容,希望文章能够帮你解决c检查模板参数的嵌套typedef以获取其标量基类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存