【发布时间】:2013-02-24 11:45:27
【问题描述】:
我现在想做一个模板,它将一些元素推送到向量和其他类型,支持push_back 运算符。
我可以这样做
template<typename T>
T fill(size_t n) {
T v;
//(1)
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
它有效。但现在我想使用v.reserve(n); 而不是(1) 来提高支持它的类型的速度。但我仍然希望能够为无法编译的类型编译此代码reserve
有什么简单的方法可以实现吗?
我知道我可能专注于硬编码类型,但它似乎并不好。
C++11 没问题。
【问题讨论】:
-
我对此表示怀疑,但我不确定。我猜你将不得不使用模板专业化
-
不太难......你需要编写一个特征来检测
reserve成员函数的存在并具有正确的签名。使用该工具有不同的方法,您可以编写一个reserve_模板函数,该函数使用该特征调度到对reserve()的调用或无操作并从// (1)调用它,或者您可以使用SFINAE 在帮助程序或fill本身中。我会尝试使用辅助函数,因为fill中的大部分代码都是相同的。 -
如果您使用 C++11,请考虑支持适当的
emplace调用以替换push_back。 -
您是否有任何理由这样做,而不是仅仅在呼叫站点致电
v.reserve(n); std::generate_n(std::back_inserter(v), n, generate_some_how);? (除了删除 1 行代码)或者它也可能更优化:v.resize(n); std::generate_n(v.begin(), n, generate_some_how); -
如果您期待标准容器或符合标准 container requirements 的容器,您应该选择
typename T::size_type而不是size_t