2011-04-06 97 views
3

我有一個基類和一些派生。我必須從每一個「註冊」一些靜態函數。這裏是例子:參考派生函數

class Base 
{ 
    // Some interface... 
}; 

class Der1 : Base 
{ 
    static void Do(); 
}; 
class Der2 : Base 
{ 
    static void Do(); 
}; 

void processStatic() 
{ 
    SomeFunc(Der1::Do); 
    SomeFunc(Der2::Do); 
} 

正如你所看到的,SomeFunc接收函數指針。我想要每一個新的派生類都自動完成,這是可能的嗎?也許,在Base類中預定義靜態函數並在那裏註冊它。但是我認爲這是不可能的,是嗎?


也許,這將是更容易理解我想要什麼:

class Der1 : Base 
{ 
    Der1() { SomeFunc(Der1::Do); } 
    static void Do(); 
}; 
class Der2 : Base 
{ 
    Der2() { SomeFunc(Der2::Do); } 
    static void Do(); 
}; 
+0

什麼' SomeFunc'呢?你希望它被稱爲每一個建築,就像你的第二個例子,或者只有一次,就像你第一個例子中推測的那樣?這是否重要?訂單是否重要? – GManNickG 2011-04-06 20:05:06

+0

你想每個班級調用一次註冊函數,還是每個對象調用一次?第一個例子暗示前者;第二個例子暗示了後者。 – 2011-04-06 20:06:10

+0

@ rob-adams每班一次。 @gman該函數將函數指針放入稍後使用的某個列表中。 – Ockonal 2011-04-06 20:07:50

回答

2

編輯:完全取代以前的答案,由於澄清的要求。

您可以使用CRTP聲明一個專門的基類,什麼都不做比撥打您的註冊功能更多:

#include <iostream> 
void SomeFunc(void(*fp)()) { 
    (*fp)(); 
}; 

template <class D> 
struct ExtraBass { 
    ExtraBass() { 
    static bool once; 
    if(!once) 
     SomeFunc(D::Do); 
    once = true; 
    } 
}; 

struct Bass { 
}; 

struct Drive : Bass, ExtraBass<Drive> { 
    static void Do() { std::cout << "Drive::Do\n"; } 
}; 

struct Deride : Bass , ExtraBass<Deride> { 
    static void Do() { std::cout << "Deride::Do\n"; } 
}; 

int main() { 
    Drive d1; 
    Deride d2; 
    Deride d3; 
} 
+0

貝斯 - >基地聽起來是不可能的。 :)雖然額外的低音可以甜。 – GManNickG 2011-04-06 20:24:47

0

我只是想知道,如果你不喜歡的東西

void SomeFunc(void (*doFunc)()) 
{ 
    doFunc(); 
} 

template <class T> int Register() 
{ 
    SomeFunc(T::Do); 
    return 0; 
} 

template <class T> class Base 
{ 
    static int _i; 
}; 

template <class T> int Base<T>::_i = Register<T>(); 

class Derived : Base<Derived> 
{ 
    public: 
    static void Do() { } 
}; 
+0

'模板 int基地 :: _ i =註冊();'這不是我正在談論的自動註冊。 – Ockonal 2011-04-06 20:50:24