假设我有一个带有各种向量的模板化函数(但由于各种原因,我在模板参数中不能提到这一点)。这是我正在尝试做的事情:在特定的位置插入一个新的默认构造元素,而不知道它的类型:
template <typename T>
void foo(T* v) {
v->insert(v->begin() + 5, decltype(v->at(0))());
}
这不起作用,但会让你了解我正在尝试做什么。我还尝试使用value_type
中的std::vector
,但我也遇到了问题。任何想法如何解决这个问题?
答案 0 :(得分:9)
将整个&#34;命名为&#34;业务:
v->emplace(v->begin() + 5);
或
v->insert(v->begin() + 5, {});
您当前的版本无效,因为decltype(v->at(0))
是参考类型。如果您正确使用value_type
,CREATE 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
的随机访问迭代器。