【问题标题】:c++ add data to a std::vector containing a std::tuplec++ 将数据添加到包含 std::tuple 的 std::vector
【发布时间】:2018-11-28 18:19:23
【问题描述】:

下面是向包含std::pair的向量添加元素的代码

std::vector<std::pair<std::string, std::type_index>> args_;

template <class T>
            inline OperationEntry& setArg(const std::string& name)
            {
                args_.push_back({name, typeid(T)});
                return *this;

            }

如何向包含std::tuple 的向量添加元素?

std::vector<std::tuple<std::string, std::type_index, Attribute>> args_;

template <class T>
            inline OperationEntry& setArg(const std::string& name, Attribute value = Attribute())
            {
                args_.push_back({name, typeid(T), value});
                return *this;

            }

我试过args_.push_back(std::make_tuple(name, typeid(T), value));

我收到此错误:

[GCC] converting to
‘std::vector<std::tuple<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::type_index,
mv::Attribute> >::value_type {aka
std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::type_index, mv::Attribute>}’ from
initializer list would use explicit constructor ‘constexpr std::tuple<
<template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements =
{const std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, const std::type_info&, mv::Attribute&};
<template-parameter-2-2> = void; _Elements =
{std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::type_index, mv::Attribute}]’

【问题讨论】:

标签: c++ c++11 vector tuples


【解决方案1】:
args_.push_back({name, typeid(T), value});

N4387 之前,std::tuple 用于上述初始化的构造函数无条件为explicit,如果在复制列表初始化中通过重载决议选择,则允许编译器引发错误。


args_.push_back(std::make_tuple(name, typeid(T), value));

上述调用将尝试对不可复制的std::type_info 实例使用复制构造函数。


要在 N4387 之前的实现中构造元组,请使用 emplace_back

args_.emplace_back(name, typeid(T), value);

或推回可复制构造类型的元组:

args_.push_back(std::make_tuple(name, std::type_index{typeid(T)}, value));
//                                         ~~~~~~~~~^

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多