#include <type_traits>
#include <utility>
#include <iostream>

template <class F, class A> auto Call(
	typename std::remove_reference<F>::type && f,
	typename std::remove_reference<A>::type && a
) -> decltype(f(std::forward<A>(a))) {
	return f(std::forward<A>(a));
}

struct Hoge { };

struct Func {
	void operator () (Hoge const & hoge) const {
		std::cout << "Hoge const &" << std::endl;		
	}
	void operator () (Hoge && hoge) const {
		std::cout << "Hoge &&" << std::endl;		
	}
};

int main(void) {
	Call(Func(), Hoge());
	return 0;
}
