Ria*_*iaD 15 c++ templates c++11
我现在想要制作模板,将一些元素推送到支持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;
}
Run Code Online (Sandbox Code Playgroud)
有用.但现在我想提高支持它的类型的速度v.reserve(n);而不是(1).但我仍然希望能够为无法编译的类型编译此代码reserve
这是一种简单的方法吗?
我知道我可能专门研究硬编码类型但它看起来并不好.
C++ 11没问题.
Xeo*_*Xeo 10
使用C++ 11的一个简单示例:
template<class T>
auto maybe_reserve(T& v, size_t n, int)
-> decltype(v.reserve(n), void())
{
v.reserve(n);
}
template<class T>
void maybe_reserve(T&, size_t, long){}
template<typename T>
T fill(std::size_t n) {
T v;
maybe_reserve(v, n, 0);
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
C++ 11中的一种可能方法:
template<typename T, typename = void>
struct reserve_helper
{ static void call(T& obj, std::size_t s) { } };
template<typename T>
struct reserve_helper<T, decltype(std::declval<T>().reserve(0), void(0))>
{ static void call(T& obj, std::size_t s) { obj.reserve(s); } };
template<typename T>
T fill(std::size_t n)
{
T v;
reserve_helper<T>::call(v, 10);
for(std::size_t i = 0; i < n; ++i){
v.push_back(generate_somehow());
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
这是一个实例,显示reserve()只是使用未定义任何reserve()成员函数的UDT跳过调用.