fork(3) download
  1. #include <iostream>
  2. #include <tuple>
  3. struct Temperature
  4. {
  5. double degrees;
  6. Temperature add(double value) {
  7. return Temperature{degrees+value};
  8. }
  9. };
  10. template<typename T> struct FunctionSignatureParser; // Must declare a primary template with a missing implementation
  11. template<typename Result, typename...Args> struct FunctionSignatureParser<Result(Args...)>
  12. {
  13. using return_type = Result;
  14. using args_tuple = std::tuple<Args...>;
  15. template <size_t i> struct arg
  16. {
  17. typedef typename std::tuple_element<i, args_tuple>::type type;
  18. };
  19. };
  20. int main() {
  21. Temperature t{16};
  22. double increment{8};
  23. 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'");
  24. std::cout << t.degrees << u8" \u00b0C + " << increment << " == " << t.add(increment).degrees << u8" \u00b0C" << std::endl;
  25. return 0;
  26. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:23:79: error: invalid use of non-static member function ‘Temperature Temperature::add(double)’
      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'");
                                                                               ^
prog.cpp:6:18: note: declared here
      Temperature add(double value) {
                  ^~~
prog.cpp:23:80: error: template argument 1 is invalid
      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'");
                                                                                ^
prog.cpp:23:88: error: template argument 2 is invalid
      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'");
                                                                                        ^
prog.cpp:23:96: error: ‘::value’ has not been declared
      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'");
                                                                                                ^~
stdout
Standard output is empty