fork(2) download
  1. template<typename... Args>
  2. struct types {};
  3.  
  4. namespace detail {
  5. template<typename... RArgs>
  6. types<RArgs...> reverse_types( types<RArgs...>, types<> ) {
  7. return types<RArgs...>();
  8. }
  9. template<typename Next, typename... Args, typename... RArgs>
  10. auto reverse_types(types<RArgs...>, types<Next, Args...>) -> decltype(reverse_types(types<Next, RArgs...>(), types<Args...>())) {
  11. return reverse_types(types<RArgs..., Next>(), types<Args...>());
  12. }
  13. } // detail
  14.  
  15. template<typename... Args>
  16. auto reverse_types() -> decltype(detail::reverse_types(types<>(), types<Args...>())) {
  17. return detail::reverse_types(types<>(), types<Args...>());
  18. }
  19.  
  20. int main() {
  21.  
  22. struct {} _ = reverse_types<char>();
  23. struct {} __ = reverse_types<char, int>();
  24.  
  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:22:36: error: conversion from ‘types<char>’ to non-scalar type ‘main()::<anonymous struct>’ requested
  struct {} _ = reverse_types<char>();
                                    ^
prog.cpp:23:42: error: no matching function for call to ‘reverse_types()’
  struct {} __ = reverse_types<char, int>();
                                          ^
prog.cpp:23:42: note: candidate is:
prog.cpp:16:6: note: template<class ... Args> decltype (detail::reverse_types(types<>(), types<RArgs ...>())) reverse_types()
 auto reverse_types() -> decltype(detail::reverse_types(types<>(), types<Args...>())) {
      ^
prog.cpp:16:6: note:   template argument deduction/substitution failed:
prog.cpp: In substitution of ‘template<class ... Args> decltype (detail::reverse_types(types<>(), types<RArgs ...>())) reverse_types() [with Args = {char, int}]’:
prog.cpp:23:42:   required from here
prog.cpp:16:83: error: no matching function for call to ‘reverse_types(types<>, types<char, int>)’
 auto reverse_types() -> decltype(detail::reverse_types(types<>(), types<Args...>())) {
                                                                                   ^
prog.cpp:16:83: note: candidates are:
prog.cpp:6:17: note: template<class ... RArgs> types<RArgs ...> detail::reverse_types(types<RArgs ...>, types<>)
 types<RArgs...> reverse_types( types<RArgs...>, types<> ) {
                 ^
prog.cpp:6:17: note:   template argument deduction/substitution failed:
prog.cpp:16:83: note:   cannot convert ‘types<char, int>()’ (type ‘types<char, int>’) to type ‘types<>’
 auto reverse_types() -> decltype(detail::reverse_types(types<>(), types<Args...>())) {
                                                                                   ^
prog.cpp:10:6: note: template<class Next, class ... Args, class ... RArgs> decltype (detail::reverse_types(types<Next, RArgs ...>(), types<Args ...>())) detail::reverse_types(types<RArgs ...>, types<Next, Args ...>)
 auto reverse_types(types<RArgs...>, types<Next, Args...>) -> decltype(reverse_types(types<Next, RArgs...>(), types<Args...>())) {
      ^
prog.cpp:10:6: note:   template argument deduction/substitution failed:
prog.cpp: In substitution of ‘template<class Next, class ... Args, class ... RArgs> decltype (detail::reverse_types(types<Next, RArgs ...>(), types<Args ...>())) detail::reverse_types(types<RArgs ...>, types<Next, Args ...>) [with Next = char; Args = {int}; RArgs = {}]’:
prog.cpp:16:83:   required by substitution of ‘template<class ... Args> decltype (detail::reverse_types(types<>(), types<RArgs ...>())) reverse_types() [with Args = {char, int}]’
prog.cpp:23:42:   required from here
prog.cpp:10:126: error: no matching function for call to ‘reverse_types(types<char>, types<int>)’
 auto reverse_types(types<RArgs...>, types<Next, Args...>) -> decltype(reverse_types(types<Next, RArgs...>(), types<Args...>())) {
                                                                                                                              ^
prog.cpp:10:126: note: candidates are:
prog.cpp:6:17: note: template<class ... RArgs> types<RArgs ...> detail::reverse_types(types<RArgs ...>, types<>)
 types<RArgs...> reverse_types( types<RArgs...>, types<> ) {
                 ^
prog.cpp:6:17: note:   template argument deduction/substitution failed:
prog.cpp:10:126: note:   cannot convert ‘types<int>()’ (type ‘types<int>’) to type ‘types<>’
 auto reverse_types(types<RArgs...>, types<Next, Args...>) -> decltype(reverse_types(types<Next, RArgs...>(), types<Args...>())) {
                                                                                                                              ^
prog.cpp:16:6: note: template<class ... Args> decltype (detail::reverse_types(types<>(), types<RArgs ...>())) reverse_types()
 auto reverse_types() -> decltype(detail::reverse_types(types<>(), types<Args...>())) {
      ^
prog.cpp:16:6: note:   template argument deduction/substitution failed:
prog.cpp:10:126: note:   candidate expects 0 arguments, 2 provided
 auto reverse_types(types<RArgs...>, types<Next, Args...>) -> decltype(reverse_types(types<Next, RArgs...>(), types<Args...>())) {
                                                                                                                              ^
prog.cpp:23:12: warning: unused variable ‘__’ [-Wunused-variable]
  struct {} __ = reverse_types<char, int>();
            ^
stdout
Standard output is empty