gpt4 book ai didi

c++ - 如何在适当的时候让模板函数在插入器上使用 back_inserter

转载 作者:行者123 更新时间:2023-11-30 00:43:29 25 4
gpt4 key购买 nike

如果可能提高效率,如何使用 std::back_inserter() 创建一个将一个集合的内容添加到另一个集合的函数?我没有看到 push_back() 的明显特征,而且我不是 std::enable_if 的专家,但我希望某种组合能够达到效果以下:

// IF HAS_PUSH_BACK:
template<typename CIn, typename COut>
void addAll(CIn && from, COut && to) {
std::copy(std::begin(from), std::end(from), std::back_inserter(to));
}

// IF ! HAS_PUSH_BACK:
template<typename CIn, typename COut>
void addAll(CIn && from, COut && to) {
std::copy(std::begin(from), std::end(from), std::inserter(to, to.begin()));
}

最佳答案

How do I create a function that adds the contents of one collection to another, using back_inserter if possible for efficiency?

我想你可以声明一个模板函数,它在有 push_back() 时返回 std::true_type

template <typename T>
constexpr auto hasPushBack (int)
-> decltype( std::declval<T>().push_back(*(std::declval<T>().begin())),
std::true_type() );

和返回std::false_type的故障回复函数

template <typename>
constexpr std::false_type hasPushBack (long);

所以你可以修改你的函数如下

template<typename CIn, typename COut>
typename std::enable_if<true == decltype(hasPushBack<COut>(0))::value>::type
addAll (CIn && from, COut && to)
{ std::copy(std::begin(from), std::end(from), std::back_inserter(to)); }

template<typename CIn, typename COut>
typename std::enable_if<false == decltype(hasPushBack<COut>(0))::value>::type
addAll(CIn && from, COut && to)
{ std::copy(std::begin(from), std::end(from), std::inserter(to, to.begin())); }

如果你可以使用 C++14 或更新的版本,你也可以定义一个模板变量的值

template <typename T>
constexpr bool hasPushBack_v = decltype(hasPushBack<T>(0))::value;

你可以简化函数如下

template<typename CIn, typename COut>
std::enable_if_t<true == hasPushBack_v<COut>>
addAll (CIn && from, COut && to)
{ std::copy(std::begin(from), std::end(from), std::back_inserter(to)); }

template<typename CIn, typename COut>
std::enable_if_t<false == hasPushBack_v<COut>>
addAll(CIn && from, COut && to)
{ std::copy(std::begin(from), std::end(from), std::inserter(to, to.begin())); }

关于c++ - 如何在适当的时候让模板函数在插入器上使用 back_inserter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53996841/

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