2015-05-05 37 views
1

這是一箇中級問題。我通過存儲指向函數的指針在C++中註冊我的事件。 目前,我將函數存儲在boost::function<void (Event*)>中,並且該函數將在事件觸發時將指向該事件的指針作爲參數。在我的函數中刪除boost :: bind的需要

要註冊一個新的事件,我做..

Event::Register("click", "Image18", boost::bind(&MyMenu::OnClick, this, _1)); 

MyMenu::OnClick(DKEvent* event) <-- calls this 

我想盡可能地簡化了我的代碼的用戶端。 如何將boost :: bind方法推入Event類。我想減少註冊事件,像這樣。少就是好。

Event::Register("click", "Image18", &MyMenu::OnClick, this); 

這可能涉及使用C++模板作爲引用的類並不總是相同的。有人可以快速瞭解我如何實現這一目標。

+0

您能否顯示'Even :: Register'的實現的當前接口和相關位? – Angew

+0

可變模板已經解決了我的問題。謝謝。 – aquawicket

回答

2

你可以做Event::Register成採取一個成員函數和實例作爲參數的模板函數:

//templated on the class and the return type and args of the member function 
template <class T, typename Ret, typename... Args> 
void Event::Register (std::string, std::string, Ret (T::*) (Args...), T*); 

你甚至都不需要在這裏提供的模板參數,編譯器將演繹它們。

1

你需要可變參數模板

template<typename... Args> 
void Event::Register(std::string ID, Args... args) 
{ 
    auto bind = std::bind(args...); 
} 

無需boost::bind

1

如果你這樣做,你正在限制你的用戶並迫使他使用一個實例的成員指針函數,而如果你這樣做的話,你將會受益於可以綁定到一個std::function的多個源,包括lambdas和免費的功能,IMO你現在的形式比你想要的更好。

如果要讓類的用戶選擇是否要將實例綁定到成員函數,可能會更好,並且您將通過提供多個模板重載(如boost::bind)來使接口變得複雜。

+1

我還保留了原來的功能,它可以在將來爲您提供一個好的目的:) – aquawicket

+0

@aquawicket好的選擇:) – Drax

相關問題