📅  最后修改于: 2023-12-03 14:39:57.689000             🧑  作者: Mango
C++17引入了一个新的工具函数std::to_address()
。 它通常用于将智能指针(例如std :: shared_ptr和std :: unique_ptr)转换为裸指针。
在某些情况下,您可能需要获取智能指针中的裸指针。 例如,当使用第三方库封装的算法时,该库可能需要裸指针而不是智能指针。 此时,您可以使用std::to_address()
获取裸指针。
以下是使用std::to_address()
的两个示例。 假设有一个封装了动态数组的MyArray
类:
template<typename T>
class MyArray {
private:
std::unique_ptr<T[]> m_Data;
size_t m_Size;
public:
MyArray(size_t size) : m_Data(new T[size]), m_Size(size) {}
T* get() const {
return m_Data.get();
}
size_t size() const {
return m_Size;
}
};
让我们尝试使用该类进行排序。 C ++标准库提供了一个名为std::sort()
的算法,以排序给定范围中的元素。 该算法接受两个迭代器begin
和end
,这些迭代器指向要排序的元素。 由于MyArray
是动态分配的数组,因此我们可以使用get()
函数获取指向原始数组的指针。 以下示例是使用std::sort()
对MyArray
进行排序的方式:
MyArray<int> data(10);
// Fill data with random integers
std::sort(data.get(), data.get() + data.size());
std::sort()
以裸指针作为参数,它要求我们使用get()
函数从智能指针中获取指针。
假设我们要计算MyArray
中元素的平均值。 我们可以使用STL算法std::accumulate()
来计算所有元素的总和,并将其除以元素的数量来获得平均值。 以下示例显示了使用std::accumulate()
的方式:
MyArray<int> data(10);
// Fill data with random integers
double sum = std::accumulate(data.get(), data.get() + data.size(), 0.0);
double average = sum / data.size();
同样,std::accumulate()
接受裸指针作为参数。 我们再次使用get()
函数从智能指针获取裸指针。
让我们看一个更复杂的示例。 假设我们正在使用std::vector<std::unique_ptr<int>>
来存储整数。 在某个时间点,我们需要将这些整数的总和存储在一个名为total
的变量中。 我们可以使用以下代码计算总和:
std::vector<std::unique_ptr<int>> numbers;
int total = 0;
for (auto& number : numbers) {
total += *std::to_address(number);
}
在这个例子中,我们使用std::to_address()
获取裸指针,并从值中获取指向的元素。
在使用std::to_address()
时,请确保传入的指针不是空指针。 否则,行为将是未定义的。
std::to_address()
是一个实用的工具函数,用于将智能指针转换为裸指针。 它在处理第三方库和使用STL算法时非常有用。