2011-04-06 90 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