2011-10-06 44 views
2

我有有成员方法f和g,两者均由常量重载的类。调用f()中的g()有 。 f和const f的方法体是相同的。C++常量过载和代码共享

class X { 
void f() {/body ... g() /} const; 
void f() {/body g() /}; 

void g() const; 
void g(); 
}; 

因为f()和g()具有相同的方法体的话,真希望有一种方法, 而不是有重复码f和const F的复制。而且,当为const对象执行f()的主体时,我希望对非const对象执行明显的const g() (对非const对象,非const对象则为非const g())。

+1

@ cu3dots:他意味着'克()'函数不同,和'F( )const'可能会调用'克()const'甚至对非const X. –

+0

不一个常过载常量性传播的返回值(而不是常量性来获得不同的行为)?有没有超过眼睛? – visitor

回答

0

,你可以这样做:

class X { 
void body(){/body ... /} const; 
void f() {body(); g(); } const; 
void f() {body(); g(); }; 

void g() const; 
void g(); 
}; 

如果不能,是不是因为/体... /有一个const和non-const版本?

如果是这样,即使是同一个来源,这是一个不同的意义 - 这将汇编不同,所以,除非你的意思是,没有通过调用一个函数共享的代码的实际行,你不能共享源。

一些想法:

  1. 使身体在body.inc宏
  2. 把身体和#包括入法(一种矫枉过正)
+0

什么,如果类X具有式克()由常量重载许多方法,使代码分离成主体()克()是不可行的? – user231536

+0

然后,你需要重复相同的代码 - 宏是这样做的一种方式。 –

1

我不相信这可以使用模板成员函数完成(但我可能很容易出错);所以最好的选择可能是将共享代码分解为另一种方法。

class X { 
    void g() const; 
    void g(); 

    void body() const { ... } 

    void f() const { body(); g(); } 
    void f() { body(); g(); } 
}; 
0
class X { 
void f_impl() const { /body } 
void f() {f_impl(); ... g(); /} const; 
void f() {f_impl(); g(); /}; 

void g() const; 
void g(); 
}; 
1

从不同的角度来看,你会不会有重复的代码,因为不一样的g()叫你f()的。你可以做的是打破代码F:

class X { 
void body() {}; 
void f() {body(); g() } const; 
void f() {body(); g() }; 

void g() const; 
void g(); 
}; 
0

您可以实现在一个模板函数,这是传递(X*)this(const X*)this F。

#include <cstdio> 

class X { 
    void g() const { std::puts("const"); } 
    void g() { std::puts("non-const"); } 

    void body() const { } 

public: 
    void f() const { f_impl(this); } 
    void f() { f_impl(this); } 

private: 
    template <class Self> 
    static void f_impl(Self* self) 
    { 
     self->body(); 
     self->g(); 
    } 
}; 

int main() 
{ 
    X x; 
    x.f(); 
    const X y = {}; 
    y.f(); 
} 

(这可能不是很好不必实现在标题为这个大型活动,虽然)。