【问题标题】:How to apply templates to multiple `std::array`s?如何将模板应用于多个`std::array`?
【发布时间】:2021-05-17 08:48:58
【问题描述】:

我有一组集合,其中所有大小在编译时都是已知的并且不会更改,我想将其传递给函数。

类似于:

void someFunction(
    std::tuple<std::array<float,SIZE1>,std::array<float,SIZE2>,std::array<float,SIZE3>> sets
) { 
    //...
}

内部std:arrays 的数量是可变的,std::arrays 的所有大小都是可变的。

现在,我不知道从哪里开始解决这个问题,非常感谢任何帮助。

【问题讨论】:

  • 您是否打算将someFunction 用作模板函数?你真的打算让这个元组按值传递吗?
  • @SamVarshavchik 我将需要遍历集合,因此std::tuple 并不理想,std::array 将是首选,但我不确定这是否可能。它更有可能通过引用传递。

标签: c++ arrays templates


【解决方案1】:

通常,您会为此使用可变参数模板:

template<std::size_t... sizes>
void someFunction(std::tuple<std::array<float,sizes>...> sets) { 
    // ...
}

... 将为元组内的所有大小扩展 std::array&lt;float,sizes&gt;

【讨论】:

    【解决方案2】:

    一个更通用的解决方案,也适用于旧标准是接受任何类型:

    template<class T>
    void someFunction(const T& sets)
    

    由于您似乎在传递可能很大的数组,因此建议使用间接。

    【讨论】:

      【解决方案3】:

      您澄清说您更喜欢使用单独的参数。使用单个元组与离散参数之间的区别并没有那么大。以下解决方案至少需要参数,并强制所有参数为相同大小的std::arrays:

      #include <tuple>
      #include <array>
      #include <type_traits>
      #include <cstdlib>
      
      template<size_t i,
           typename ...T,
           typename=std::enable_if_t<std::conjunction_v<
                         std::is_same<T, std::array<float, i>>...>>
           >
      void someFunction(const std::array<float, i> &first,
                const T &...others)
      {
      }
      
      void foo()
      {
          someFunction(std::array<float, 5>{}); // OK.
      
          someFunction(std::array<float, 5>{},
                   std::array<float, 5>{}); // OK.
      
          someFunction(std::array<float, 5>{},
                   std::array<float, 10>{}); // ERROR.
      }
      

      一些特征是 C++17 和更高版本,但可以在 C++11 和 C++14 中轻松地重新实现。

      【讨论】:

      • 该函数将采用大量其他参数,最好将这些集合包含在 1 个参数中。数组还需要能够在大小上有所不同。抱歉在这里没有像我应该做的那样具体(我还在胡闹),对此感到抱歉。
      • 没问题,这是一个很好的心理练习——设计一种在编译时强制所有数组大小相同的方法。
      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多