2011-10-06 46 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(); 
} 

(這可能不是很好不必實現在標題爲這個大型活動,雖然)。