是否有相当于 std::forward 的移动或复制功能,可以在 std::ranges 中完美转发?

问题描述 投票:0回答:1

如何将以下两个功能合二为一?有没有类似于 std::forward 的东西,但是对于 ranges

#include <ranges>
#include <vector>
#include <algorithm>

template<class RangeIn, class RangeOut>
void moveOrCopy(RangeIn& from, RangeOut& to)
{
    std::ranges::copy(from, std::back_inserter(to));
}

template<class RangeIn, class RangeOut>
    requires std::is_rvalue_reference_v<RangeIn&&>
void moveOrCopy(RangeIn&& from, RangeOut& to)
{
    std::ranges::move(from, std::back_inserter(to));
}

void test()
{
  std::vector<int> a, b;
  moveOrCopy(a, b); // copy
  moveOrCopy(std::move(a), b); // move
}

std::ranges::forward_range,但那是与forward_iterator相关,不是完美的转发。


带有上述代码的便捷工具:https://cppinsights.io/s/45c86608

C++ 参考资料的直观参考:https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers

c++ c++20 perfect-forwarding std-ranges
1个回答
0
投票

这不是太聪明,但是

if constexpr
可以清理一点:

#include <ranges>
#include <vector>
#include <algorithm>

template<class RangeIn, class RangeOut>
void forward_range(RangeIn&& from, RangeOut& to)
{
    if constexpr(std::is_rvalue_reference_v<RangeIn&&>)
        std::ranges::move(from, std::back_inserter(to));
    else
        std::ranges::copy(from, std::back_inserter(to));
}

void test()
{
  std::vector<int> a, b;
  forward_range(a, b); // copy
  forward_range(std::move(a), b); // move
}
© www.soinside.com 2019 - 2024. All rights reserved.