c++ - 写智能指针和指针的泛型代码时,如何获取简单指针?

标签 c++ c++11

当我想实现一个功能时:

template <typename TIterator>
void doSomething(TIterator begin, TIterator end);

能够与两者一起工作:

std::vector<Widget*>

std::vector<std::shared_ptr<Widget>>

我应该如何访问底层指针?由于某种原因std::shared_ptr<Widget>不能隐式转换为 Widget*我必须使用 get()功能。这样,代码不适用于 std::vector<Widget*>Widget*没有get()功能。

我的做法是:

void functionAcceptingPointer(Widget* widget);

template <typename TIterator>
void doSomething(TIterator begin, TIterator end);
{
    std::map<double, decltype(&(**begin))> map;
    ...
    auto firstPointer = &(**begin);
    ...
    functionAcceptingPointer(&(**begin));
    ....
}

那就是使用双重解引用 *其次是 &运算符,每当我需要一个普通指针时。

它完成了工作,但我很好奇是否有一些更具可读性、通常使用的方法来做到这一点,以及在我用像 &(**begin) 这样丑陋的东西填充我的代码后是否有一些东西可以回来困扰我。

最佳答案

以下是我为解决此问题所做的工作:

#include <memory>

template <class T>
inline
T*
to_raw_pointer(T* p) noexcept
{
    return p;
}

template <class Pointer>
inline
typename std::pointer_traits<typename std::remove_reference<Pointer>::type>::element_type*
to_raw_pointer(Pointer&& p) noexcept
{
    return ::to_raw_pointer(p.operator->());
}
int main()
{
    std::shared_ptr<int> p1(new int(1));
    int* r1 = to_raw_pointer(p1);
    int* p2 = new int(2);
    int* r2 = to_raw_pointer(p2);
}

关于c++ - 写智能指针和指针的泛型代码时,如何获取简单指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15368624/

相关文章:

c++ - 为什么我们需要第二个 std::forward 特化?

c++ - gcc 4.8.1 是否支持 C++11 垃圾回收?

c++ - 如何配置 NetBeans 静态链接 MinGW C++ 库?

c++ - 从 QMap 中删除所有值

C++11为什么 'decltype(x)'和 'decltype((x))'的类型不同?

c++ - 为什么 constexpr 必须是静态的?

c++ - 如何从模板参数(std::vector 和普通指针)中提取 value_type?

c# - 如何从文本文件中提取文件路径

c++ - 如何删除 QStringList 中的冗余元素

python - Qt中两个MainWindow()之间的通信