fork download
  1. #include <boost/fusion/include/for_each.hpp>
  2. #include <boost/fusion/adapted/std_tuple.hpp>
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <utility>
  7. #include <tuple>
  8.  
  9. #include <cxxabi.h>
  10.  
  11. auto demangle = [](const char* str) -> const char*
  12. {
  13. static int sta;
  14. return abi::__cxa_demangle(str, 0, 0, &sta);
  15. };
  16.  
  17. struct disp {
  18. ::std::ostream& os;
  19. disp(::std::ostream& os):os(os){}
  20. template<typename T>
  21. ::std::ostream& operator()(T& x) const
  22. { return os << x << " "; }
  23. };
  24.  
  25. struct Bar
  26. {
  27. Bar():s(""){ ::std::cout << "default constructor" << ::std::endl; }
  28. Bar(Bar&& arg):s(std::move(arg.s)){ ::std::cout << "move constructor of " << s << ::std::endl; }
  29. Bar(Bar const&arg):s(arg.s){ ::std::cout << "copy constructor of " << s << ::std::endl; }
  30. Bar(std::string str):s(str){ ::std::cout << "initialize " << s << ::std::endl; }
  31. ::std::string s;
  32. };
  33.  
  34. template<typename...Args>
  35. struct Foo
  36. {
  37. Foo(Args&&... args)
  38. : t_(std::forward<Args>(args)...)
  39. { }
  40. // ref確認用
  41. void change()
  42. {
  43. boost::fusion::for_each(t_, [](Bar& b){ b.s += std::string("_"); });
  44. }
  45.  
  46. std::tuple<Args...> t_;
  47. };
  48.  
  49. // lvalue refならlvelue refのまま扱う
  50. template<typename...Args>
  51. auto foo(Args&... args)
  52. -> Foo<Args&...>
  53. {
  54. return Foo<Args&...>{args...};
  55. }
  56. // rvalue refならmoveする
  57. template<typename...Args>
  58. auto foo(Args&&... args)
  59. -> Foo<Args...>
  60. {
  61. return Foo<Args...>{std::forward<Args>(args)...};
  62. }
  63.  
  64. ::std::ostream& operator<<(::std::ostream& os, Bar const& bar)
  65. {
  66. return os << bar.s;
  67. }
  68. template<typename...Args>
  69. ::std::ostream& operator<<(::std::ostream& os, Foo<Args...> const& foo)
  70. {
  71. boost::fusion::for_each(foo.t_, disp(os));
  72. return os;
  73. }
  74.  
  75. int main(int, char*[])
  76. {
  77. Bar bl("lvalue"), bx("xvalue");
  78. auto f = foo(bl, std::move(bx), Bar("prvalue"));
  79.  
  80. // lvelueは参照のまま,rvalueはどちらもキャプチャしてある
  81. ::std::cout << demangle(typeid(f).name()) << ::std::endl;
  82. ::std::cout << f << ::std::endl;
  83.  
  84. // 挙動確認
  85. f.change();
  86. ::std::cout << f << ::std::endl;
  87. ::std::cout << bl << ::std::endl;
  88.  
  89. // constも
  90. Bar const bcl("lvalue"), bcx("xvalue");
  91. auto fc = foo(bcl, std::move(bcx));
  92.  
  93. ::std::cout << demangle(typeid(fc).name()) << ::std::endl;
  94. ::std::cout << fc << ::std::endl;
  95.  
  96. return 0;
  97. }
  98.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:1:45: fatal error: boost/fusion/include/for_each.hpp: No such file or directory
compilation terminated.
stdout
Standard output is empty