【问题标题】:How to create function whose type depends on a number of varidic arguments如何创建类型取决于多个可变参数的函数
【发布时间】:2021-03-19 17:01:58
【问题描述】:

我的目标是构建一个函数,该函数将给定维度作为可变参数,将数组转换为 n 维向量。

例如二维。

template<T>
vector<vector<T>> from_array(T *array, size_t d1, size_t d2) {
    auto v = vector<vector<T>();
    v.reserve(d2);
    for (n = 0; n < d2; n++) {
         vector(array, array + size)
    }
}

我已经用谷歌搜索了一段时间,似乎我想要Homogeneous variadic function parameters,但它们在 c++ 中不可用。但也许有更简单的解决方案或解决方法?

我似乎也需要使用decltype,但我对c++的经验几乎为零,所以我不确定如何使用它。

【问题讨论】:

  • 请举例说明如何使用模板(这更好地定义了它应该如何实现,然后是你的实现方法)。
  • 这里有一个更根本的问题:C++ 不能这样工作。除非您明确检查参数的每个可能值并实例化相应的类型实例,否则您无法根据某些运行时参数创建不同的类型。
  • 我个人会放弃返回向量,而是编写一个封装一维向量的类,并通过提供正确的访问函数将缓冲区视为您需要的任何维度。这可以为您提供最佳性能,并且更容易计算和编写。
  • @SamVarshavchik 并非如此。我认为参数的数量在这里定义了返回类型,这是在编译时知道的。
  • 可以在此处查看该想法的粗略草图:您可以在此处查看基本示例:stackoverflow.com/questions/43358369/…

标签: c++ variadic-templates


【解决方案1】:

如果您不介意颠倒大小参数的顺序(因此最外层维度是第一个参数而不是最后一个参数),这相当简单:

template <class T>
auto from_array(const T*array, size_t d0) {
  return std::vector<T>(array, array + d0);
}

template <class T, class... Sizes>
auto from_array(const T *array, size_t d0, Sizes... szs) {
  std::vector<decltype(from_array(array, szs...))> ret;
  ret.reserve(d0);
  for (size_t i = 0; i < d0; ++i) {
      ret.emplace_back(from_array(array, szs...));
      array += (szs * ... * 1);
  }
  return ret;
}

但我同意评论,其中提到使用将数组视为多维的访问器封装数组可能是一个更好的主意,而不是将其复制到一堆嵌套向量中。

【讨论】:

  • 谢谢?我稍后会尝试您的解决方案。至于封装——显然更好,如果那是我的代码,我会这样做,但事实并非如此。我只是为现有的 c++ 库创建一个 c 包装器来为其创建 Rust 包装器。
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多