fork(1) download
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <utility>
  5. #include <vector>
  6.  
  7. struct Sender {
  8.  
  9. template<typename Iter>
  10. std::size_t operator()(Iter begin, Iter end) {
  11. for(Iter cur = begin; cur != end; ++cur) {
  12. // your low-level send stuff
  13. }
  14. return (end - begin);
  15. }
  16. };
  17.  
  18. struct Receiver {
  19.  
  20. template<typename Iter>
  21. std::size_t operator()(Iter begin, Iter end) {
  22. for(Iter cur = begin; cur != end; ++cur) {
  23. // your low-level receive stuff
  24. }
  25. return (end - begin);
  26. }
  27. };
  28.  
  29. template<typename Fn>
  30. struct Bar
  31. {
  32. protected:
  33. Fn _fn;
  34. public:
  35. Bar(Fn fn) : _fn(std::move(fn)) { }
  36.  
  37. template<typename Container>
  38. std::size_t call_fn(Container & container)
  39. {
  40. return _fn(std::begin(container), std::end(container));
  41. }
  42. };
  43.  
  44. template<typename Fn>
  45. auto create_bar(Fn && fn) -> Bar<typename std::remove_reference<Fn>::type> {
  46. return { std::forward<Fn>(fn) };
  47. }
  48.  
  49. template<typename Iter>
  50. std::size_t my_foo(Iter begin, Iter end) {
  51. return (end - begin);
  52. }
  53.  
  54. int main(int argc, char ** argv) {
  55. typedef typename std::vector<int>::iterator iter;
  56. // functors
  57. auto functor = create_bar(Sender());
  58. // lambdas
  59. auto lambda = create_bar([](iter begin, iter end) -> std::size_t { return (end - begin); });
  60. // plain old functions
  61. auto function = create_bar(&my_foo<iter>);
  62.  
  63. std::vector<int> tmp = { 0, 1, 2, 5};
  64.  
  65. std::cout << "Functor: " << functor.call_fn(tmp) << std::endl;
  66. std::cout << "Lambda: " << lambda.call_fn(tmp) << std::endl;
  67. std::cout << "Function: " << function.call_fn(tmp) << std::endl;
  68.  
  69. return 0;
  70. }
Success #stdin #stdout 0s 2984KB
stdin
Standard input is empty
stdout
Functor: 4
Lambda: 4
Function: 4