Метод как параметр по умолчанию для метода

В настоящее время я работаю над Set-классом для курса C++, который является производным от vector<T>,

В какой-то момент я пришел к тому, что мне нужно было реализовать функцию под названием index() который, очевидно, будет возвращать (если набор содержит его) индекс объекта в этом наборе. При написании всего класса я пришел к тому, что мне нужно перегрузить эти index() метод, который где оба публичный. Итак, вот мои два типа методов: 1-й. с 3 параметрами:

size_t index ( T const& x,size_t const& l, size_t const& r) const
{

    if(l > size()||r>size())
        throw("Menge::index(): index out of range.");

    //cut the interval
    size_t m = (l+r)/2;

    // x was found
    if( x == (*this)[m])
        return m;

    // x can't be found
    if( l==m)
        return NPOS;

    //rekursive part
    if( x < (*this)[m])
        return index(l,m,x);

    return index(m+1,r,x);

}

2-й с одним параметром:

bool contains ( T const& elem ) const{
    return index(elem, 0, size()-1)!=NPOS;
}

Дело в том, что я не хочу писать эти 2 метода, они могут быть объединены в один, если это возможно. Я думал о значениях по умолчанию для index() метод, так что я бы написал метод-наподобие:

size_t index (T const& x, size_t const& l=0, size_t const& r=size()-1)const;

который дал мне ошибку:Elementfunction can't be called without a object

Подумав об этой ошибке, я попытался отредактировать ее в:

size_t index (T const& x, size_t const& l=0, size_t const& r=this->size()-1)const;

Но это дало мне ошибку: You're not allowed to call >>this<< in that context.

Может быть, я что-то пропустил, но, пожалуйста, дайте мне знать, если кто-нибудь из вас может сказать мне, можно ли вызвать метод в качестве параметра по умолчанию или нет.

1 ответ

Решение

Вы не можете использовать this при определении аргументов по умолчанию.

Указатель this не допускается в исходных аргументах по умолчанию.

Обычный способ добиться этого - предоставить перегрузку с меньшим количеством аргументов, что соответствует исходной ситуации, которой вы избегали.

size_t index ( T const& x,size_t const& l, size_t const& r) const;
size_t index ( T const& x ) const {
    index( x, 0, size() - 1 );
}

В качестве альтернативы вы можете рассмотреть назначение магического числа в качестве аргумента по умолчанию, который вы можете проверить в своей реализации.

#include <limits>

constexpr size_t magic_number = std::numeric_limits<size_t>::max();

size_t index ( T const & x, size_t l = 0, size_t r = magic_number) const
{
    if(r == magic_number) {
        r = size() - 1;
    }

    // Actual implementation
}
Другие вопросы по тегам