嗯。我覺得我有些討厭。代碼不是很漂亮或者不錯,但你可能會明白。您應該能夠使用模板來遞歸地存儲任何類型的對象,並且在調用該函數時通過它們遞歸。
#include <iostream>
template<typename first_arg, typename... args>
class Event
{
public:
Event(void (*fn)(first_arg, args...), first_arg first, args... in) : m_func(fn), var(first, in...) {}
void operator()()
{
var(m_func);
}
private:
void (*m_func)(first_arg, args...);
template <typename t_arg, typename... t_args>
struct storage;
template <typename t_arg>
struct storage<t_arg>
{
storage(t_arg t) : m_var(t) {}
template<typename t_func, typename... tt_args>
void operator()(t_func fn, tt_args... p)
{
fn(p..., m_var);
}
t_arg m_var;
};
template <typename t_arg, typename t_arg2, typename... t_args>
struct storage<t_arg, t_arg2, t_args...>
{
storage(t_arg t, t_arg2 t2, t_args... p) : m_var(t), m_storage(t2, p...) {}
template<typename t_func, typename... tt_args>
void operator()(t_func fn, tt_args... p)
{
m_storage(fn, p..., m_var);
}
t_arg m_var;
storage<t_arg2, t_args...> m_storage;
};
storage<first_arg, args...> var;
};
void test(int a, float b)
{
std::cout << a << std::endl << b << std::endl;
}
int main()
{
Event<int, float> event(test, 10, 100.0);
event();
}
另外,我覺得標準::綁定做類似的東西,但不知道:d
要回答你的第一個問題,你是否試圖編譯這個? – MSN 2010-09-30 20:35:16
如果你想要的東西與Qt信號非常相似,但是不使用Qt,你可以嘗試[Boost.Signals](http://www.boost.org/doc/libs/1_43_0/doc/html/signals.html)(或者看一下代碼來吸取一些靈感,但是它們還沒有使用C++ 0x)。 – 2010-10-01 06:51:00
是的,我確實試圖編譯這個,唯一讓麻煩的部分是參數...傳遞到底部。 – 2010-10-03 08:08:09