fork(1) download
  1. #include <iostream>
  2. #include <map>
  3. #include <set>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <type_traits>
  7.  
  8. template <typename T>
  9. class has_find {
  10. template <typename C> static std::true_type test( decltype(&C::find) ) ;
  11. template <typename C> static std::false_type test(...);
  12. public:
  13. using type = decltype(test<T>(nullptr));
  14. static const bool value = type();
  15. };
  16.  
  17. template <typename T>
  18. int foo( const T & t ) { return 1; }
  19.  
  20. // overload for std::vector
  21. template <class T>
  22. int foo( const std::vector< T> & vec ) { return 2; }
  23.  
  24. template <class... T>
  25. int foo( const std::map< T... > & vec ) { return 3; }
  26.  
  27. template<class...T>
  28. int foo(const std::basic_string<T...>& str){ return 4; }
  29.  
  30. template <class... T>
  31. int foo( const std::set< T... > & vec ) { return 5; }
  32.  
  33. template<class C>
  34. bool contains(C const& c, typename C::value_type const& e){
  35. return std::find(begin(c), end(c), e) != std::end(c);
  36. }
  37.  
  38. template<template<class...> class C, class E, class ... Etc>
  39. auto contains(C<E, Etc...> const& c, E const& e) -> decltype(c.find(e), true) {
  40. return c.find(e) != std::end(c);
  41. }
  42.  
  43. template<class E>
  44. auto contains(std::basic_string<E> const& c, E const& e) -> bool {
  45. return c.find(e) != std::string::npos;
  46. }
  47.  
  48. template<class C, class E, class ... Es>
  49. auto contains(C const& s, E const & e, Es...es) -> bool {
  50. return contains(s, e) && contains(s, es...);
  51. }
  52.  
  53. int main() {
  54. std::map<int, std::string> m {{4,"test"}};
  55. std::vector<int> v;
  56. std::set<int> s {2,4,6,8};
  57. int i{};
  58. std::string str = "abcz";
  59. std::cout << foo(i) << foo(v) << foo(m) << foo(str);
  60. std::cout << contains(v, 4) << contains(m, 4) << contains(s, 2, 4, 6) << contains(str, 'z')
  61. << contains(str, 'z', 'a');
  62. }
  63.  
Success #stdin #stdout 0.01s 5408KB
stdin
Standard input is empty
stdout
123401111