将包含void指针的对转换为一对其他类型的指针

101*_*010 3 c++ pointers casting void-pointers c++11

讨论

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

void *vptr;
...
foo* fptr = static_cast<foo*>(vptr);
Run Code Online (Sandbox Code Playgroud)

)

我所拥有的是一对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));
Run Code Online (Sandbox Code Playgroud)

或者从C++ 11开始:

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

这种铸造有更整洁,更优雅或更有效的方式吗?

Tar*_*ama 9

你可以把它分解成一个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) };   
}
Run Code Online (Sandbox Code Playgroud)

然后像这样打电话:

pair_cast<foo*, bar*>(vpr);
Run Code Online (Sandbox Code Playgroud)

Live Demo

  • 我建议使用`static_pair_cast <...>(...)`和`dynamic_pair_cast <...>(...)`.不过,他们也是一脉相承的. (2认同)