无临时实现转换运算符

时间:2014-08-13 17:15:43

标签: c++

我有一个类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);
    ...
}

但这需要对现有代码进行更多更改,这是更多工作。

所以我的问题是:是否有可能以不需要构建目标类型的新实例的方式实现转换运算符?我只需要为现有实例分配新状态。

2 个答案:

答案 0 :(得分:3)

虽然您无法在不临时的情况下实施转换运算符,但您可以通过更改BigClass以接受来自Bob的分配来解决此问题:

class BigClass {
...
public:
    BigClass& operator=(const Bob& bob) {
        // Do the fast assignment
    }
};

现在x = *it将在没有特殊转换运算符的情况下进行编译。

答案 1 :(得分:0)

以下想法怎么样?

  1. BigClass内维护class Bob个对象。
  2. 从转换运算符返回对它的常量引用。
  3. 每次更改对象时更改它(即,在每个非常量成员函数中)。

  4. class Bob
    {
    public:
        const BigClass& operator() const
        {
            return bigClass;
        }
    private:
        BigClass bigClass;
    };