如果有,则调用函数,否则忽略

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)

实例.有关解释,请查看此处.


And*_*owl 6

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跳过调用.