📜  C++中的std :: to_address及其示例(1)

📅  最后修改于: 2023-12-03 14:39:57.689000             🧑  作者: Mango

C++中的std :: to_address及其示例

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;
    }
};
示例1

让我们尝试使用该类进行排序。 C ++标准库提供了一个名为std::sort()的算法,以排序给定范围中的元素。 该算法接受两个迭代器beginend,这些迭代器指向要排序的元素。 由于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()函数从智能指针中获取指针。

示例2

假设我们要计算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()函数从智能指针获取裸指针。

示例3

让我们看一个更复杂的示例。 假设我们正在使用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算法时非常有用。