-1

我需要从库中获取一些复杂的数据,然后在上层使用这些数据。数据由两部分组成:在评估数据 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);
}
4

1 回答 1

1

怎么样

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

于 2021-12-30T12:59:39.997 回答