C ++ - динамически использовать либо ссылку, либо локальную переменную - PullRequest
4 голосов
/ 21 октября 2010

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

struct Container{
    vector<int> storage;
};

float foo(Container* aContainer){
    if(aContainer!=NULL)
        vector<int>& workingStorage=aContainer->storage;
    else
        vector<int> workingStorage; 


    workingStorage.reserve(1000000);
    ....use workingStorage to calculate something......

    return calculated_result;
}

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

Конечно, я мог бы просто в конце функции скопировать локальную переменную в хранилище Контейнера, но это не то, что я хочу сделать.

Спасибо!

Ответы [ 5 ]

14 голосов
/ 21 октября 2010

Создайте локальный std::vector<int> с именем local_storage для случая, когда вызывающая сторона не предоставила контейнер, затем создайте ссылку на любой контейнер, который вы фактически собираетесь использовать.

std::vector<int> local_storage;

std::vector<int>& working_storage = aContainer 
                                        ? aContainer->storage 
                                        : local_storage;
3 голосов
/ 21 октября 2010

Один из способов решения этой проблемы - разбить функцию foo на 2 функции

float foo(Container* aContainer){ 
  if(aContainer!=NULL) {
    return foo_core(aContainer->storage);
  } else { 
    vector<int> workingStorage;  
    return foo_core(workingStorage);
}

float foo_core(vector<int>& workingStorage) { 
  ... 
  // rest of original foo
}
1 голос
/ 21 октября 2010

Дизайн видимо ужасен.Но, учитывая, что вам нужно дополнительное внешнее хранилище, у JaredPar (его ответ) есть хорошая идея.Очистка, которая далее:

struct Container
{
    vector<int> storage;
};

double foo( vector<int>& workingStorage )
{
    workingStorage.reserve( 1000000 );
    //....use workingStorage to calculate something......
    return calculated_result;
}

double foo( Container& storageProvider )
{
    return foo( storageProvider.storage );
}

double foo()
{
    vector<int> storage;
    return foo( storage );
}

Приветствия & hth.,

1 голос
/ 21 октября 2010
vector<int> temp;
vector<int>& workingStorage = (aContainer!=NULL) ? aContainer->storage : temp;
0 голосов
/ 21 октября 2010

Почему бы вам не убедиться, что aContainer->storage инициализирован, прежде чем передать aContainer его foo.Это делает ваш код намного более аккуратным.В начале функции нужно указать assert, чтобы проверить aContainer->storage на NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...