fork(1) download
  1. #include <iostream>
  2.  
  3. constexpr int MIN_FOO = 0, MAX_FOO = 100;
  4.  
  5. struct Foo
  6. {
  7. template <int N>
  8. void operator() (char, double, bool) {std::cout << "Foo<" << N << ">(char, double, bool) called.\n";}
  9. };
  10.  
  11. struct Bar
  12. {
  13. template <int N>
  14. void operator() () {std::cout << "Bar<" << N << ">() called.\n";}
  15. };
  16.  
  17.  
  18. template <int Low, int High, typename Fun, typename... Args>
  19. void searchBinary (int key, Fun f, Args... args)
  20. {
  21. constexpr int Mid = (Low + High) /2;
  22. if (key == Mid)
  23. {
  24. f.template operator()<Mid>(std::forward<Args>(args)...);
  25. }
  26. else if (key < Mid)
  27. {
  28. searchBinary<Low, Mid - 1>(key, f, std::forward<Args>(args)...);
  29. }
  30. else
  31. {
  32. searchBinary<Mid + 1, High>(key, f, std::forward<Args>(args)...);
  33. }
  34. }
  35.  
  36. template <typename Fun, typename... Args>
  37. void executeBinarySearch (int n, Fun f, Args... args)
  38. {
  39. searchBinary<MIN_FOO, MAX_FOO, Fun>(n, f, std::forward<Args>(args)...);
  40. }
  41.  
  42. int main()
  43. {
  44. executeBinarySearch (99, Foo(), 'a', 1.5, true);
  45. executeBinarySearch (99, Bar());
  46. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
Foo<99>(char, double, bool) called.
Bar<99>() called.