#include <iostream>
#include <tuple>
struct Temperature
{
	double degrees;
	Temperature add(double value) {
		return Temperature{degrees+value};
	}
};
template<typename T> struct FunctionSignatureParser; // Must declare a primary template with a missing implementation
template<typename Result, typename...Args> struct FunctionSignatureParser<Result(Args...)>
{
	using return_type = Result;
	using args_tuple = std::tuple<Args...>;
	template <size_t i> struct arg
	{
		typedef typename std::tuple_element<i, args_tuple>::type type;
	};
};
int main() {
	Temperature t{16};
	double increment{8};
	static_assert(std::is_same<double, FunctionSignatureParser<decltype(t.add)>::arg<0>::type>::value, "Method 'Temperature::add' does not use an argument of type 'double'");
	std::cout << t.degrees << u8" \u00b0C + " << increment << " == " << t.add(increment).degrees << u8" \u00b0C" << std::endl;
	return 0;
}