使用另一个类的函数重载函数

时间:2017-07-09 09:45:32

标签: c++ overloading

我有一个BinaryMemoryReader类,其函数定义如下:

template <typename T>
inline void read(T **data) {
    *data = (T*)&stream[position];
    position += sizeof(T);
}

它处理内存流中的大多数标准类型。

自定义复杂类型具有自己的读取功能,例如:

void AnotherClass::read(BinaryMemoryReader *const reader)
{
    reader->read<bool>(&num);
    reader->read<short>(&count);
}

我想写的是当我写

时会写的代码
reader->read<AnotherClass>(&var);

会调用第二个函数。这意味着AnotherClass的读取函数会使该特定类型的BinaryMemoryReader读取函数重载。

这将允许我编写更清晰的代码。

修改 一般的想法是:

  1. 拥有一个中心BinaryMemoryReader课程。
  2. 在其中有一个通用的读取功能来处理标准类型。
  3. 请将语法称为bmr->read<int>(&intVar);
  4. 在自己的类中定义专门的读取函数。
  5. 最重要的是,调用它们的语法是bmr->read<customType>(&customTypeVar);
  6. 这样,特定的读取函数将与它们自己的类相关联,但是可以从BinaryMemoryReader调用。

1 个答案:

答案 0 :(得分:1)

正如我在评论中写的那样,我会使用以下方法:

  1. 拥有模板化自由功能

    template <typename T>
    void read(BinaryMemoryReader& bmr, T& data) {
        bmr.read(&data);
    }
    
  2. 为您要处理的每种类型专门化该功能

    class AnotherClass {
         template <typename T>
         friend void read(BinaryMemoryReader& bmr, T &data);
    
         bool num;
         short count;
     };
    
     template <>
     void read(BinaryMemoryReader& bmr, AnotherClass &data) {
         bmr.read<bool>(&(data.datanum));
         bmr.read<short>(&(data.count));
     };
    
  3. 称之为

     BinaryMemoryReader bmr;
     AnotherType at;
     read(bmr,at);
    
  4. 该技术用于例如 c ++标准I / O库和为

    提供的重载
     std::ostream& operator<<(std::ostream&, const T&);
     std::istream& operator>>(std::istream&, T&);
    

    功能

    或者,你可以对BinaryMemoryReader::read()函数进行专门化。但BinaryMemoryReader必须是所有班级专业化的friend