非靜態成員函數需要一個對象來處理,因此不能像普通函數指針那樣傳遞和調用。
,讓您debounce
方法工作的最簡單方法,是使用捕捉你的player
對象,並調用它increment
拉姆達:
class Button {
//...
template<typename Callback>
void debounce(Callback&& func) { // <<-- Note the && here, without
// it func would need to be
// copied
if (millis() - buttonDownTime > debounceTime) {
func();
}
}
}
void loop() {
//...
button.debounce([&player](){ player.incriment(); });
}
隨着額外的努力一點點,你可以實現的東西類似於C++ 17的std::invoke
來統一調用任何類型的可調用對象。既然你在Arduino的,並沒有進入C++標準庫,你需要實現std::remove_reference
和std::forward
自己還有:
template <typename T>
struct remove_reference
{
using type = T;
};
template <typename T>
struct remove_reference<T&>
{
using type = T;
};
template <typename T>
struct remove_reference<T&&>
{
using type = T;
};
template <typename T>
constexpr T&& forward(typename remove_reference<T>::type& t)
{
return static_cast<T&&>(t);
}
template <typename T>
constexpr T&& forward(typename remove_reference<T>::type&& t)
{
return static_cast<T&&>(t);
}
template <typename Callable, typename... Args>
auto invoke(Callable&& func, Args&&... args)
-> decltype(forward<Callable>(func)(forward<Args>(args)...))
{
return forward<Callable>(func)(forward<Args>(args)...);
}
template <typename Callable, typename Class, typename... Args>
auto invoke(Callable&& method, Class&& obj, Args&&... args)
-> decltype((forward<Class>(obj).*method)(forward<Args>(args)...))
{
return (forward<Class>(obj).*method)(forward<Args>(args)...);
}
class Button {
//...
template<typename Callback, typename... Args>
void debounce(Callback&& func, Args&&... args) {
if (millis() - buttonDownTime > debounceTime) {
invoke(forward<Callback>(func),
forward<Args>(args)...);
}
}
}
void loop() {
//...
button.debounce(&Player::increment, player);
}
這並不完全做的一切,C++ 17的std::invoke
,但它足夠接近實現基本回調。它也給你額外的靈活性,你可以通過額外的參數debounce
,他們將沿着你的回調傳遞:
void foo(int num) { /*...*/ }
void loop() {
Button b;
b.debounce(foo, 42);
}
此,如果您需要保存回調,過一會兒給它並沒有真正的工作,但它看起來並不像你想要做的那樣。
你想['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)。 –
我們確實需要一個規範的。誰想製作一個? – Brian
@CaptainObvlious saddly功能不包括在AVR中爲arduino :( – austinbv