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