- , , .
debounce - , player increment:
class Button {
template<typename Callback>
void debounce(Callback&& func) {
if (millis() - buttonDownTime > debounceTime) {
func();
}
}
}
void loop() {
button.debounce([&player](){ player.incriment(); });
}
++ 17 std::invoke . Arduino ++, 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);
}
, ++ 17 std::invoke, , . , debounce, :
void foo(int num) { }
void loop() {
Button b;
b.debounce(foo, 42);
}
, , , .