gpt4 book ai didi

c++ - 如何使用 move 语义迭代器和模板

转载 作者:太空狗 更新时间:2023-10-29 20:52:25 26 4
gpt4 key购买 nike

我想编写函数来添加项目。 addItem 和 addItems 每个都有一个 move 变体。后者接受两个输入迭代器。要添加单个项目,我可以使用右值引用重载签名。但是如何重载模板函数以使用 move 语义?

void addItem(const shared_ptr<Item>& item, uint score) {
// code that copies the shared_ptr…
}

void addItem(shared_ptr<Item>&& item, uint score) {
// code that moves the shared_ptr…
}

template<typename Iterator>
void addItems(Iterator begin, Iterator end) {
/*
* What to do here to take both move and normal iterators?
* Since I cannot overload by signature I dont know how to
* differentiate between move and non move iterators
*/
}

是否可以为一个函数指定一个名称并区分输入迭代器?

最佳答案

由于您使用迭代器插入列表,最直接的解决方案是使用 move 迭代器。使用 move 迭代器,您无需更改模板函数 addItems。 move 迭代器会将引用的元素 move 到新容器中:

// Same function as before
addItems(
std::make_move_iterator(someList.begin()),
std::make_move_iterator(someList.end())
);

或者,您可以提供 move 插入函数,它使用 std::move 算法:

template<typename Iterator>
void moveItems(Iterator begin, Iterator end) {
std::move(begin, end, thelist.end());
}

此重载会将每个元素 move 到 thelist 容器中。 std::move 算法旨在与普通的非 const 迭代器一起使用。 move 项目功能是这样使用的:

std::vector<int> vec{1, 2, 3};

// move each ints into the new container
moveItems(vec.begin(), vec.end());

// With your old function, move semantics
// can still be applied with move Iterators
addItems(
std::make_move_iterator(vec.begin()),
std::make_move_iterator(vec.end())
);

关于c++ - 如何使用 move 语义迭代器和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46079803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com