将数据从库传输到上层然后返回,中间不命名

Transfer data from library to upper level and then back without naming it inbetween

我需要从库中获取一些复杂的数据,然后在上层使用这些数据。数据由两部分组成:在评估数据 A 时,我得到了一些额外的数据 B,并且数据 B 应该“按原样”返回到库中,以免再次重新评估它。

所以为了简化这个:我从库中获取数据A和数据B,将两者都传输到上层,使用A,但是我应该将数据B传输回库。

问题是(除了这个奇怪的架构)我不希望我的上层知道任何关于数据 B 的信息,那么我应该使用什么机制来避免在上层代码中定义特定于库的数据类型?数据应作为指针传递。

我正在考虑 void*,但 C++17 允许使用 std::any,我不太了解。我可以使用 std::unique_ptr<std::any> 吗?或者只是 std::any 而不是?

应该是这样吗?

std::any GetDataAandB() 
{
    std::unique_ptr ret = std::make_unique<LibraryType>(1, "");
    return std::make_any<std::unique_ptr<LibraryType>>( ret);
}

怎么样

using LibraryData = std::pair<A, std::any>;

// Get aata of type A and B, store B in std::any -> hiding it's type
// and return both values, but with B's type hidden
LibraryData GetDataAandB()
{
   A someValue;
   B someValueB_HiddenType;
   return LibraryData(A, std::any(B));
}


// Work with the first part of the Data
void ConsumeData(const LibraryData &data)
{
   // return the data to the library
   callLibrary(data);

 
   // or do something with the individual part A
   const A& dataOfTypeA = data.first;
   dataOfTypeA.SomeMethod();

   // Cannot really do anything with 'B', since its type is hidden
   const std::any& dataOfUnknownType = data.second;

   // create a new LibraryData object
   LibraryData newData(dataOfTypeA, dataOfUnknownType);

   callLibrary(newData);


   // Or, in case we can "guess" the type:
   try {
      B shouldBeB=std::any_cast<B>(data.second);
      // do something with B
   }
   catch (std::exception &e) {
      // Nope, it's not of type B.
      // std::any_cast will throw a bad_any_cast exception
   }
}

std::any 处理任何需要的指针,因此您不必添加 unique_ptr