c ++ 11对象,可以作为" double(*)[4]"

时间:2017-08-30 16:01:56

标签: c++ c++11 stdvector stdarray

我需要在具有签名的外部库中调用函数:

void fn(double (*values)[4]);

但我希望传递像std::vector<std::array<double, 4>>这样的对象,它必须符合c ++ 11标准。我该怎么称呼这个功能?

2 个答案:

答案 0 :(得分:1)

  

我该如何调用此功能?

调用该函数最干净的方法是:

  1. 创建一个包含四个双打的数组。
  2. 从适当的来源填充数组中的数据。
  3. 将数组的地址传递给函数
  4. double array[4];
    
    // Fill up the array with data
    for (size_t i = 0; i < 4; ++i )
    {
       array[i] = ...;
    }
    
    fn(&array);
    

    为了能够在std::vector<std::array<double, 4>>时调用该函数,您可以创建几个包装函数。

    void fn_wrapper(std::array<double, 4>>& in)
    {
      double array[4];
    
      // Fill up the array with data
      for (size_t i = 0; i < 4; ++i )
      {
         array[i] = in[i];
      }
    
      fn(&array);
    
      // If you fn modified array, and you want to move those modifications
      // back to the std::array ...
      for (size_t i = 0; i < 4; ++i )
      {
         in[i] = array[i];
      }
    }
    
    void fn_wrapper(std::vector<std::array<double, 4>>& in)
    {
       for ( auto& item : in )
       {
          fn_wrapper(item);
       }
    }
    

答案 1 :(得分:1)

有了这个:

std::vector<std::array<double, 4>> my_array;
...
// Function call:
fn((double(*)[4]) &my_array[array_index][0]);