当我想实现一个功能时:
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)