我有一个类Bob,我可以转换为另一个类BigClass。 BigClass有一个昂贵的构造函数,但为现有的BigClass分配一个新的状态是合理有效的。
我现有的代码以类似下面的方式使用BigClass(设计的示例代码)
vector<BigClass> data;
BigClass x;
for (vector<BigClass>::const_iterator it = data.begin(), end_it = data.end(); it != end_it; ++it)
{
x = *it;
...
}
重复使用相同的BigClass实例来加快循环内部的速度。
我想将源数据结构更改为Bobs之一。我可以将Bob定义为以下内容。
class Bob
{
public:
BigClass operator() const
{
return BigClass(...);
}
};
这将最大限度地减少对我的代码的更改。但是,每个x = *it
都会导致创建BigClass的临时代价。
速度非常重要,正在处理千兆字节的数据。我担心这种变化会太慢。 (不,我还没有描述,因为我还没有写它,但它已经需要几分钟才能运行。)
如果它太慢,我正在考虑以下事项:
class Bob
{
public:
void Output(BigClass& x)
{
x = ...;
}
};
vector<Bob> data;
BigClass x;
for (vector<Bob>::const_iterator it = data.begin(), end_it = data.end(); it != end_it; ++it)
{
it->Output(x);
...
}
但这需要对现有代码进行更多更改,这是更多工作。
所以我的问题是:是否有可能以不需要构建目标类型的新实例的方式实现转换运算符?我只需要为现有实例分配新状态。
答案 0 :(得分:3)
虽然您无法在不临时的情况下实施转换运算符,但您可以通过更改BigClass
以接受来自Bob
的分配来解决此问题:
class BigClass {
...
public:
BigClass& operator=(const Bob& bob) {
// Do the fast assignment
}
};
现在x = *it
将在没有特殊转换运算符的情况下进行编译。
答案 1 :(得分:0)
以下想法怎么样?
BigClass
内维护class Bob
个对象。class Bob
{
public:
const BigClass& operator() const
{
return bigClass;
}
private:
BigClass bigClass;
};