struct Apple { };
struct Banana { };
struct Peach { };

using FruitTuple = std::tuple<Apple, Banana, Peach>;

template<typename TTuple, typename TItem>
TTuple& getParentTuple(TItem* mItemPtr)
{
    // <static assert that the tuple item types are unique>
    // ...?
}

int main()
{
    FruitTuple ft;

    // I know these pointers point to objects inside a `FruitTuple`...
    Apple* ptrApple{&std::get<0>(ft)};
    Banana* ptrBanana{&std::get<1>(ft)};
    Peach* ptrPeach{&std::get<2>(ft)};

    // ...is there a way to get the `FruitTuple` they belong to?
    auto& ftFromA(getParentTuple<FruitTuple>(ptrApple));
    auto& ftFromB(getParentTuple<FruitTuple>(ptrBanana));
    auto& ftFromP(getParentTuple<FruitTuple>(ptrPeach));

    assert(&ftFromA == &ftFromB);
    assert(&ftFromB == &ftFromP);
    assert(&ftFromA == &ftFromP);

    return 0;
}

如何以符合标准的非体系结构相关的的方式来实现getParentTuple<TTuple, TItem>

最佳答案

不可能。

编辑:

我认为该标准中没有任何东西可以阻止兼容的元组实现在堆上单独分配元素。

因此,元素的存储位置将不允许任何导致元组对象位置的推断。

您唯一可以做的就是扩展元素类,使其还包含一个指向该元组的后向指针,然后在将元素放入该元组后填写该元组。

09-25 20:43