【问题标题】:Template to compute size of Eigen matrix or tuple type object用于计算特征矩阵或元组类型对象大小的模板
【发布时间】:2022-12-23 20:40:56
【问题描述】:

我正在尝试编写一些可以计算某些数据大小的通用代码。这个大小基本上是数组/元组类结构或特征矩阵中元素的数量。

我尝试了以下

template <typename T>
constexpr int getDataSize(T /*t*/)
{
    return std::tuple_size_v<T>;
}

template <typename Derived>
constexpr int getDataSize(Eigen::MatrixBase<Derived> /*t*/)
{
    using T = Eigen::MatrixBase<Derived>;
    return T ::RowsAtCompileTime * T::ColsAtCompileTime;
}

但是编译器总是试图实例化第一个模板,当我传递一个特征矩阵时也是如此。由于 Eigen 对象不存在 tuple_size_v,因此无法编译。

https://godbolt.org/z/d6T638K1e中的示例

我如何以通用方式计算此大小?

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    最小的修复是:

    template <typename ...P>
    constexpr int getDataSize(std::tuple<P...>)
    {
        return sizeof...(P);
    }
    

    或者,也支持std::pairs 和std::arrays:

    template <typename T>
    requires requires{std::tuple_size<T>::value;} // Because `tuple_size_v` is not SFINAE-friendly.
    constexpr int getDataSize(T)
    {
        return std::tuple_size_v<T>;
    }
    

    此外,参数(元组和特征矩阵)应通过 const 引用传递,以避免复制。

    或者,更好的是,由于您无论如何都忽略了这些值,因此您应该使用类/变量模板而不是函数。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2023-04-11
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      相关资源
      最近更新 更多