相关疑难解决方法(0)

编译器如何区分"vector :: insert"的两个变体?

我正在实施一个简单的std::vector.有两个insert功能:

template <typename T, typename Allocator>
typename Vector<T, Allocator>::iterator
Vector<T, Allocator>::insert(const_iterator pos, size_type count, const T& value)
{
    checkIterator(pos);
    auto p = const_cast<iterator>(pos);
    if (count == 0) {
        return p;
    }
    for (size_type i = 0; i < count; ++i) {
        p = insert(p, value);
    }
    return p;
}

template <typename T, typename Allocator>
template <typename InputIt>
typename Vector<T, Allocator>::iterator
Vector<T, Allocator>::insert(const_iterator pos, InputIt first, InputIt last)
{
    checkIterator(pos);
    auto p = const_cast<iterator>(pos);
    if (first == …
Run Code Online (Sandbox Code Playgroud)

c++ stl c++11

7
推荐指数
1
解决办法
280
查看次数

C++:SFINAE来区分填充和范围构造函数?

是一个询问如何区分填充和范围构造函数的问题.代码复制到这里:

template <typename T>
struct NaiveVector {
    vector<T> v;
    NaiveVector(size_t num, const T &val) : v(num, val) { // fill
        cout << "(int num, const T &val)" << endl;
    }

    template <typename InputIterator>
    NaiveVector(InputIterator first, InputIterator last) : v(first, last) { // range
        cout << "(InputIterator first, InputIterator last)" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用,如该问题中所述.解决方案是使用SFINAE来定义范围构造函数,如下例所示:

template
<
    typename InputIterator
,   typename = typename ::std::enable_if
    <
        ::std::is_same
        <
            T &
        ,   typename ::std::remove_const
            <
                decltype(*(::std::declval< InputIterator >()))
            >::type
        >::value …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits c++11

4
推荐指数
1
解决办法
190
查看次数

标签 统计

c++ ×2

c++11 ×2

stl ×1

type-traits ×1