【问题标题】:std::vector insert without knowing the type of the elementsstd::vector 在不知道元素类型的情况下插入
【发布时间】:2017-05-26 07:20:57
【问题描述】:

假设我有一个模板函数,它接受各种向量(但由于各种原因,我不能在模板参数中提及这一点)。这就是我想要做的:在特定位置插入一个新的、默认构造的元素,而不知道它的类型:

template <typename T>
void foo(T* v) {
  v->insert(v->begin() + 5, decltype(v->at(0))());
}

这不起作用,但可以让您了解我正在尝试做什么。我也尝试使用std::vector 中的value_type,但我也遇到了问题。任何想法如何解决这个问题?

【问题讨论】:

  • 您应该得到一个错误,希望能描述问题。例如,GCC 说,“错误:引用类型的值初始化”
  • v.insert(v.begin() + 5, decltype(v)::value_type() );
  • @RichardCritten 这行不通,而且工作量太大;我们已经可以使用T
  • “采用各种向量(但由于各种原因我不能在模板参数中提及这一点” 这将有助于指定 what这些原因是。“这不起作用”解释为什么是密切相关的 - 错误是什么。“我也遇到了问题” ... 什么问题?

标签: c++ c++11 vector


【解决方案1】:

回避整个“命名类型”业务:

v->emplace(v->begin() + 5);

v->insert(v->begin() + 5, {});

您当前的版本不起作用,因为decltype(v-&gt;at(0)) 是一个引用类型。 value_type 如果你正确使用它应该可以工作,但是如果没有看到你在做什么,我不能说它有什么问题。

【讨论】:

  • 可能value_type 被这样使用:v-&gt;insert(v-&gt;begin() + 5, T::value_type{}) 当它需要像这样使用v-&gt;insert(v-&gt;begin() + 5, typename T::value_type{})
  • 后续问题:如果我确实必须在向量的值类型上调用静态函数怎么办?那我确实需要类型,对吗?说:decltype(v-&gt;at(0))::Bar(),但这也不起作用。
  • std::remove_reference&lt;decltype(v-&gt;at(0))&gt;::type::Bar()。如果您不关心强制执行静态性,也可以使用通常的 . 语法。
【解决方案2】:

如果您知道v 始终是某种元素类型的std::vector,那么就这样开始吧,所以T 是元素类型,而不是向量类型:

template <typename T>
void foo(std::vector<T>* v) {
  v->insert(v->begin() + 5, T());
}

这也确保了v-&gt;insert()v-&gt;begin() + 5 是有效的语句。您的原始代码允许为v 传递anything,因此不能保证v-&gt;insert()v-&gt;begin() 存在,或者begin() 返回一个接受@987654331 的随机访问迭代器@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多