【发布时间】:2015-06-02 13:18:20
【问题描述】:
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> 如何以标准兼容和不依赖架构的方式实现?
【问题讨论】:
-
可以假设你的元组不包含多个相同类型的实例吗?
-
我不认为 std::stuple 给你足够的内存布局保证来做到这一点是一种独立于实现的方式。
-
您是否可以从结构的子对象(例如标准布局)转到封闭的结构对象已经是个问题了。虽然诸如 C++ 对象模型、标准布局保证和
offsetof之类的东西强烈暗示你可以,但标准只是害羞地说你可以这样做,例如对对象的底层字节执行指针算术,这是您绝对需要的。
标签: c++ pointers tuples c++14 memory-layout