如果我有一个因子函数f
:
typedef std::vector<int> IntVec;
const IntVec f(...) {
IntVec retval;
...
return retval;
}
我需要在声明后延迟定义如下:
IntVec instance;
if (...) {
instance = f(a, ...);
}
else {
instance = f(b, ...);
}
有建议的方法吗?
现在,我使用容器的指针来执行它:
std::auto_ptr<IntVec> pinstance(NULL);
if (...) {
pinstance.reset(new IntVec(f(a, ...)));
}
else {
pinstance.reset(new IntVec(f(b, ...)));
}
IntVec& instance(*pinstance);
有更好的方法吗?
由于
答案 0 :(得分:3)
IntVec retval;
所有这一切都是一个空的向量。它已初始化,但就内容而言,为空,您可以根据需要添加它。
另外,
IntVec instance;
if (...) {
instance = f(a, ...);
}
else {
instance = f(b, ...);
}
这是合法的。
实例确实被f
的返回覆盖,但效率命中可以忽略不计,我怀疑你经常运行这个功能。
你也可以这样做..
IntVec instance = f(...?a:b,...);
//if
如果您的if
声明与您展示的一样简单。
最后指针的示例存在缺陷。
我猜pinstance
很快会在instance
之前被销毁,在这种情况下,instance
会成为悬空参考。
答案 1 :(得分:1)
使用C ++ 11,如果您的数据类型支持移动分配,则交换非常有效:
#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;
int main()
{
std::vector<int> inst;
std::srand((unsigned)time(0));
// code to set condition.
if (rand()%2)
{
std::vector<int> v1(10,10);
std::swap(inst, v1);
cout << "V1" << endl;
std::copy(v1.begin(), v1.end(), ostream_iterator<int>(cout,"\n"));
}
else
{
std::vector<int> v2(11,11);
std::swap(inst, v2);
cout << "V2" << endl;
std::copy(v2.begin(), v2.end(), ostream_iterator<int>(cout,"\n"));
}
cout << "Instance" << endl;
std::copy(inst.begin(), inst.end(), ostream_iterator<int>(cout,"\n"));
return 0;
}
<强>输出强>
V2
Instance
11
11
11
11
11
11
11
11
11
11
11
注意V2中没有内容,因为它已与空向量实例交换。
看起来你已经掌握了悬挂参考资料,所以我会在你的问题的第二部分留下它。