【问题标题】:C++ Create vector or list from argument parameter packsC++ 从参数参数包创建向量或列表
【发布时间】:2018-09-05 15:42:34
【问题描述】:

我正在寻找解决方案,将 User 对象的参数组合成可迭代的 std::vectorstd::list

auto user_group = create_user_group(User(), User(), User(), User());

例子

template <typename ...Users>
auto create_user_group(Users&&... users)
{
    return std::vector<Users...>{std::forward<Users>(users)...};
}

错误

error: wrong number of template arguments (4, should be at least 1)
  return std::vector<Users...>{std::forward<Users>(users)...};

【问题讨论】:

  • 那么...std::vector&lt;User, User, User, User&gt;?
  • 所有向量元素具有相同的单一类型。您的可变参数模板毫无意义。
  • @liliscent 用户是父类接口
  • @StoryTeller 是的,完全正确
  • std::vector 仅支持单一类型T

标签: c++ vector c++14 variadic-templates c++17


【解决方案1】:

您需要分隔一个参数以传递给std::vector

template <typename User, typename ...Users>
auto create_user_group(User &&user, Users&&... users)
{
    return std::vector<std::decay_t<User>>{
        std::forward<User>(user), std::forward<Users>(users)...
    };
}

【讨论】:

  • +1 进行修复。但老实说,这是一个模拟练习。 OP(在评论中)提到它是一个基类接口......所以下一步是“为什么我的对象不是正确的类型?”
  • 最好也删除 cv-qualifier,否则你的向量可能有 const 元素类型,这是不正确的。但老实说,以这种方式使用转发 ref 通常是非常可疑的。
  • @StoryTeller 该评论稍后发表。在那种情况下,它确实只是工业级的对象切片。
  • @liliscent 完成。在我看来并非如此,因为我只是使用第一种类型来推断向量的参数,但仍然希望它不受影响地完美转发。
【解决方案2】:

如果“用户”有不同的类型,那么您需要一个类型列表。幸运的是,C++ 有tuple 可以用作类型列表:

template <typename ...Users>
decltype(auto)
create_user_group(Users&&... users) {
  return std::make_tuple(std::forward<Users>(users)...);
}

Live Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2012-09-27
    • 1970-01-01
    • 2010-12-15
    • 2017-09-06
    相关资源
    最近更新 更多