    #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;
    }