将一对包含空指针的指针强制转换为一对其他类型的指针

Cast a pair containing void pointers to a pair of pointers of other type

本文关键字:指针 其他 转换 类型 空指针 包含      更新时间:2023-10-16

讨论

我知道将void指针强制转换为其他类型的指针的正确方法是使用static_cast。(例如

void *vptr;
...
foo* fptr = static_cast<foo*>(vptr);

)

不过,我有一对void指针(即std::pair<void*, void*>),我想将其转换为一对其他类型的指针(例如std::pair<foo*, bar*>)。

我能想到的实现这一目标的最天真的方法是:

std::pair<void*, void*> vpr;
...
std::pair<foo*, bar*> fbpr = std::make_pair(static_cast<foo*>(vpr.first), static_cast<bar*>(vpr.second));

或者从C++11:开始

std::pair<void*, void*> vpr;
...
auto fbpr = std::make_pair(static_cast<foo*>(vpr.first), static_cast<bar*>(vpr.second));

问题

有没有一种更整洁、更优雅或更有效的方法来铸造?

您可以将其分解为pair_cast函数:

template <typename D1, typename D2, typename S1, typename S2>
std::pair<D1,D2> pair_cast (const std::pair<S1,S2>& p) {
    return { static_cast<D1>(p.first), static_cast<D2>(p.second) };   
}

然后这样调用:

pair_cast<foo*, bar*>(vpr);

实时演示