在为智能指针和指针编写通用代码时,如何获得简单的指针?

Mar*_*dik 3 c++ c++11

当我想实现一个功能时:

template <typename TIterator>
void doSomething(TIterator begin, TIterator end);
Run Code Online (Sandbox Code Playgroud)

能够同时使用:

std::vector<Widget*>
Run Code Online (Sandbox Code Playgroud)

std::vector<std::shared_ptr<Widget>>
Run Code Online (Sandbox Code Playgroud)

我该如何访问底层指针?由于某种原因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));
    ....
}
Run Code Online (Sandbox Code Playgroud)

这是使用操作符*后面的双重引用&,只要我需要一个普通的指针.

它完成了这项工作,但我很好奇是否有一些更易读,通常使用的方法来做到这一点,如果有一些东西可以回来困扰我,我填写我的代码与丑陋的东西,如 &(**begin)

How*_*ant 11

这是我为解决这个问题所做的工作:

#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);
}
Run Code Online (Sandbox Code Playgroud)

  • @HowardHinnant:我会通过引用获取智能指针,这不允许在临时对象上调用它.哪个好,因为(A)你的代码目前不能用于`unique_ptr`,而(B)`to_raw_pointer`可能_release_指向的对象,如果它传递一个独立的临时对象则返回. (3认同)
  • 对.只要你的智能指针实现`operator - >()`并且符合`pointer_traits`,你就可以了.并且`pointer_traits`的设计使大多数智能指针即使偶然也符合.当'D :: pointer`本身是一个智能指针时,这个设计甚至会处理`std :: unique_ptr <T,D>`. (2认同)