2015-03-02 130 views
1

假设我有两个班需要遍历其它一些类如何指定函数参数的常量是可选的?

class Reader { 
public: 
    template<typename T> 
    void Process(const T& t) { 
     Traverse(*this, t); 
    } 
    //... ends of recursion 
}; 

class Writer { 
public: 
    template<typename T> 
    void Process(T& t) { 
     Traverse(*this, t); 
    } 
    //... ends of recursion 
}; 

的成员,我对每个类别ReaderWriter需要处理它们提供的功能Traverse超载。例如:

class Foo { 
public: 
    template<typename T> 
    friend void Traverse(T& t, const Foo& foo) { // for class Reader 
     t.Process(foo.m1); 
     t.Process(foo.m2); 
    } 

    template<typename T> 
    friend void Traverse(T& t, Foo& foo) { // for class Writer 
     t.Process(foo.m1); 
     t.Process(foo.m2); 
    } 
private: 
    int m1; 
    int m2; 
}; 

Foo类主体的功能Traverse上述两个超载几乎相同。我怎样才能让他们成为一体?传递给const参数

+1

http://ideone.com/HWz2WJ – 2015-03-03 03:53:30

回答

1

任何非const值将被强制转换为const所以您不必到第二Traverse(),除非你确实需要修改foo

+0

我需要修改'foo',这就是为什么第二个类名为'Writer'的原因。 – JAH 2015-03-02 13:58:21

+0

即使我不修改它们。 “const Traverse”中的't.Process(foo.m1)'仍然无法编译,因为'foo.m1'已经是const,但是't.Process'需要一个非const参数。 – JAH 2015-03-02 14:06:38

相关问题