我想做这样的事情(我知道这不会编译):
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的存储中,但这不是我想要做的。
谢谢!
答案 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。