Могу ли я передать 0 в функцию, ожидающую параметр векторного типа? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть функция, как таковая:

void foo(int checkInt, vector<int> vect, int x) {
    EXECx = x;
    EXECcheckInt = checkInt;
    if (EXECcheckInt > 0) {
         //do something to vect
    } else {
        Timer.rset();
    }
}

Как видно, vect оставляют в покое, если checkInt не выше 0. Итак, если я хочу передать checkInt 0, то, похоже, мне не придется беспокоиться о vect.

Поэтому мне кажется, что мне нужно некоторое фиктивное значение, чтобы войти в эту функцию для vect, так какое значение будет работать, или мне нужно передать фиктивный вектор? Моя идея состояла в том, чтобы просто передать 0, но я предполагаю, что это не сработает.

Я пытался привести его, как в foo(0,(vector<int>)0,0), но я был удивлен, что когда я попытался распечатать vect, он просто оказался пустым (без 0 внутри), с функцией, написанной так:

void foo(int checkInt, vector<int> vect, int x) {
    for (auto i = vect.begin(); i != vect.end(); ++i)
        std::cout << *i << ' ';
}

Как мне поступить об этом?

Я работаю с C ++ 98.

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Код выглядит так, как будто функция решает, используется ли вектор или нет, но то, что вы хотите сделать, предполагает, что именно вызывающая сторона решает, использовать вектор или нет.Кто это на самом деле?Я думаю, что у вас есть проблема с дизайном, исправьте это, тогда вам больше не нужно приводить 0 к вектору.(например, создайте две функции, одна из которых принимает вектор, а другая не принимает вектор в качестве параметра)

В любом случае вы можете захотеть взглянуть на std::optional, которая доступна только с C ++17, но это может дать вам некоторое вдохновение о том, как справиться с такой ситуацией в чистом виде.«Грязный» способ - передать указатель, а затем проверить, является ли он nullptr внутри функции.

При приведении не создается вектор, заполненный 0, а вектор размером 0.

2 голосов
/ 21 марта 2019

Измените объявление функции, чтобы принимать ссылку на вектор, чтобы избежать ненужного копирования памяти, например:

void foo(int checkInt, vector<int>& vect, int x)

Если у вас уже есть векторный объект, вы можете передать его, даже если он не используется.Если вам нужно создать фиктивный вектор, вы можете вызвать функцию следующим образом:

vector<int> v;
foo (0, v, x);
0 голосов
/ 21 марта 2019

Вы можете предоставить перегрузку, которая может быть вызвана без вектора.Вы можете преобразовать общую часть в подфункцию:

void foo(int checkInt, vector<int> vect, int x) {
    if (checkInt > 0) {
         bar(checkInt, x);
         //do something to vect
    } else {
        foo(checkInt, x);
    }
}

void foo(int checkInt, int x) {
    assert(checkInt <= 0);   // maybe unnecessary. depends on what you need
    bar(checkInt, x);
    Timer.rset();
}

void bar(int checkInt, int x) {
    EXECx = x;
    EXECcheckInt = checkInt;
}

// with vect
foo(checkInt, vect, x);

// without vect
foo(0, 0);

, но я был удивлен, что когда я попытался распечатать vect, он просто оказался пустым (в нуле нет 0)

Неясно, почему это вас удивляет.Согласно документации, конструктор вектора, который принимает целое число, создает столько элементов в построенном векторе.Вектор с 0 элементами пуст.


Обратите внимание, что вам, вероятно, следует пересмотреть вопрос о том, хотите ли вы передать вектор по значению.Вы уверены, что вам нужна копия?

...