C ++ - 动态使用引用或局部变量

时间:2010-10-20 21:50:33

标签: c++ reference

我想做这样的事情(我知道这不会编译):

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;
}

所以 - 如果我将一个Container传递给函数,我希望函数使用容器中的向量来代替局部变量。如果没有提供容器,则应使用局部变量。

当然我可以在函数的最后将局部变量复制到Container的存储中,但这不是我想要做的。

谢谢!

5 个答案:

答案 0 :(得分:14)

为调用者未提供容器的情况创建名为std::vector<int>的本地local_storage,然后创建对实际将要使用的容器的引用。

std::vector<int> local_storage;

std::vector<int>& working_storage = aContainer 
                                        ? aContainer->storage 
                                        : local_storage;

答案 1 :(得分:3)

解决此问题的一种方法是将函数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
}

答案 2 :(得分:1)

vector<int> temp;
vector<int>& workingStorage = (aContainer!=NULL) ? aContainer->storage : temp;

答案 3 :(得分:1)

设计显然可怕。但鉴于您可以选择外部提供的存储,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 );
}

干杯&amp;第h。,

答案 4 :(得分:0)

在将aContainer->storage传递给aContainer之前,为什么不确保foo已初始化。这使你的代码更整洁。在函数开头有一个assert语句,用于检查aContainer->storage是否为NULL。