仅在实现中自动进行类型转换

Automatic type conversions in the implementation only

本文关键字:类型转换 实现      更新时间:2023-10-16
  1. 两类:ProcessorData
  2. Data表示用户可以传递给Processor的公共方法的一些数据对象。
  3. 在内部,Processor需要使用基于Data InternalData类型。
  4. 我制作了从DataInternalData并返回Processor内部的私有转换函数,以避免重复代码并本地化Data的界面有一天会更改时所需的更改。
  5. 但我希望这些转换隐含在Processor而不是显式。
  6. 这些转换函数仅供Processor实现使用。
    不应该从外部世界看到或访问。
  7. InternalData是一种库类型。我无法控制它,也无法修改其界面。
    也就是说,我不能只向它们添加转换构造函数或转换运算符成员函数。
    如果您愿意,可以将其视为内置类型。
  8. 我也不想将这些转换器放在类Data,因为这不是它的业务,它不应该知道Processor内部将其转换为其他东西。

长话短说,我希望Processor的实现知道如何隐式地在DataInternalData之间进行类型转换,但除了Processor之外,没有其他人能够做到这一点,甚至不知道它在Processor的实现中完成。

有什么办法可以在C++中做到这一点吗?

我对解决方案的尝试

我的第一个尝试是在Data内部制作转换构造函数和转换运算符,使它们private,并使Processor成为能够访问这些私有转换器的Data friend。但这比我想要的要多:它Processor可以完全访问Data的内部结构,这很糟糕。

然后我注意到这堆函数(转换器)一起构成了一种Data接口,但这个接口应该只供Processor使用。所以我做了一个抽象的基类InternalDataConversions并在那里声明这些转换函数,如pure virtual。我把这堂课变成了Processorfriend。然后,我创建了 Data 类以私下派生,并实现了这些转换器。这样Processor可以在内部使用这个"转换接口",但它无法访问Data内部的任何其他内容,这更好。
但缺点是,现在Data类需要在其定义中指定一些它不应该关心的东西,并且不必要地使它依赖于InternalDataInternalDataConversions,这是丑陋的。

有什么更好的主意吗?

您可以在 InternalData 中提供转换成员函数。复制构造函数可以取Data,转换运算符可以返回一个。

class InternalData
{
public:
    InternalData(const Data & data);
    operator Data() const;
};

据推测InternalData Processor是私有的,因此这不会使界面混乱。