【问题标题】:Cast a pair containing void pointers to a pair of pointers of other type将包含 void 指针的一对转换为一对其他类型的指针
【发布时间】:2016-03-01 10:03:45
【问题描述】:

讨论

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

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

)

我拥有的是一对void 指针(即std::pair&lt;void*, void*&gt;),我想将其转换为一对其他类型的指针(例如std::pair&lt;foo*, bar*&gt;)。

我能想到的最天真的方法是:

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));

问题

有没有更简洁、更优雅或更高效的方式来进行这种铸造?

【问题讨论】:

    标签: c++ pointers c++11 casting void-pointers


    【解决方案1】:

    您可以将其分解为 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);
    

    Live Demo

    【讨论】:

    • 我建议使用static_pair_cast&lt;...&gt;(...)dynamic_pair_cast&lt;...&gt;(...)。不过,它们的思路是一样的。
    • @DietmarKühl 是的,这将更符合std::static_pointer_cast 和朋友。这留给读者作为练习:p
    • @TartanLlama 截止日期是什么时候? :P。非常感谢!
    猜你喜欢
    • 2021-07-22
    • 2021-09-20
    • 1970-01-01
    • 2017-10-07
    • 2015-02-14
    • 1970-01-01
    • 2018-06-10
    • 2016-07-26
    相关资源
    最近更新 更多