std :: vector insert,不知道元素的类型

时间:2017-05-25 21:07:39

标签: c++ c++11 vector

假设我有一个带有各种向量的模板化函数(但由于各种原因,我在模板参数中不能提到这一点)。这是我正在尝试做的事情:在特定的位置插入一个新的默认构造元素,而不知道它的类型:

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

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

2 个答案:

答案 0 :(得分:9)

将整个&#34;命名为&#34;业务:

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

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

您当前的版本无效,因为decltype(v->at(0))是参考类型。如果您正确使用value_typeCREATE TEMPORARY TABLE weeks (weekNo INT); INSERT INTO weeks (weekNo) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54); SELECT WeekNo, SUBDATE(DATE(i.TimeStamp), INTERVAL WEEKDAY(DATE(i.TimeStamp)) DAY) AS date_of_week, COUNT(distinct PatientID) PatientCount, COUNT(distinct PatientID, AcquisitionDate) StudyCount FROM image_info i RIGHT OUTER JOIN weeks w ON WEEK(DATE(i.TimeStamp)) = WeekNo GROUP BY WeekNo; 应该有效,但如果没有看到您正在做的事情,我就无法说出它的错误。

答案 1 :(得分:1)

如果您知道v始终是某个元素类型的std::vector,那么只需按照那种方式键入它,因此T是元素类型,而不是矢量类型:

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

这也确保v->insert()v->begin() + 5是有效的陈述。原始代码允许为v传递任何,因此无法保证v->insert()v->begin()存在,或begin()返回接受+ 5的随机访问迭代器。