【发布时间】:2015-09-08 16:04:35
【问题描述】:
我有这个函数模板:
template<typename Collection, typename T>
void insertColElement(Collection col, const T& element, std::true_type)
{
col.insert(col.end(), std::move(element));
}
如果 T 是可移动构造的,则调用它。现在我想用 Collection = std::vector<..> 和 T = std::pair<std::unique_ptr<..>, bool> 调用这个函数,但是编译器抱怨删除了 unique_ptr 和 pair 的复制构造函数。我已经尝试过使用 emplace 并分别移动 first 和 second ,但是编译器仍然想调用复制构造函数。
编辑:
这里是所有相关代码sn-ps:
template<typename Collection, typename T>
void insertColElement(Collection col, T&& element, std::true_type)
{
col.insert(col.end(), std::forward<T>(element));
}
template<typename Collection, typename T>
void insertColElement(Collection col, T& element, std::false_type)
{
static_assert(std::is_copy_constructible<T>::value,
"Serialization: Collection type is neither copy nor move constructable");
col.insert(col.end(), element);
}
template<typename Archive, typename Collection>
inline void loadCollection(Archive& ar, Collection& col)
{
int size;
ar >> size;
for(int i = 0; i < size; i++) {
typename Collection::value_type element;
ar >> element;
insertColElement(col, std::move(element),
typename std::is_move_constructible<typename Collection::value_type>::type());
}
}
这些函数是我正在研究的一个小型序列化模块的一部分。 loadCollection 用于从档案中加载容器。导致问题的调用如下所示:
IStreamArchive a(filestream);
std::vector<std::pair<std::unique_ptr<Scope>, bool>> vec;
a << vec;
【问题讨论】: