fork(3) download
  1. #include <deque>
  2. #include <forward_list>
  3. #include <list>
  4. #include <map>
  5. #include <queue>
  6. #include <set>
  7. #include <stack>
  8. #include <string>
  9. #include <tuple>
  10. #include <type_traits>
  11. #include <unordered_map>
  12. #include <unordered_set>
  13. #include <utility>
  14. #include <vector>
  15. #include <type_traits>
  16. #include <iostream>
  17.  
  18. //specialize a type for all of the STL containers.
  19. namespace is_stl_container_impl{
  20. template <typename T> struct is_stl_container:std::false_type{};
  21. template <typename... Args> struct is_stl_container<std::array <Args...>>:std::true_type{};
  22. template <typename... Args> struct is_stl_container<std::vector <Args...>>:std::true_type{};
  23. template <typename... Args> struct is_stl_container<std::deque <Args...>>:std::true_type{};
  24. template <typename... Args> struct is_stl_container<std::list <Args...>>:std::true_type{};
  25. template <typename... Args> struct is_stl_container<std::forward_list <Args...>>:std::true_type{};
  26. template <typename... Args> struct is_stl_container<std::set <Args...>>:std::true_type{};
  27. template <typename... Args> struct is_stl_container<std::multiset <Args...>>:std::true_type{};
  28. template <typename... Args> struct is_stl_container<std::map <Args...>>:std::true_type{};
  29. template <typename... Args> struct is_stl_container<std::multimap <Args...>>:std::true_type{};
  30. template <typename... Args> struct is_stl_container<std::unordered_set <Args...>>:std::true_type{};
  31. template <typename... Args> struct is_stl_container<std::unordered_multiset<Args...>>:std::true_type{};
  32. template <typename... Args> struct is_stl_container<std::unordered_map <Args...>>:std::true_type{};
  33. template <typename... Args> struct is_stl_container<std::unordered_multimap<Args...>>:std::true_type{};
  34. template <typename... Args> struct is_stl_container<std::stack <Args...>>:std::true_type{};
  35. template <typename... Args> struct is_stl_container<std::queue <Args...>>:std::true_type{};
  36. template <typename... Args> struct is_stl_container<std::priority_queue <Args...>>:std::true_type{};
  37. }
  38.  
  39. //type trait to utilize the implementation type traits as well as decay the type
  40. template <typename T> struct is_stl_container {
  41. static constexpr bool const value = is_stl_container_impl::is_stl_container<std::decay_t<T>>::value;
  42. };
  43.  
  44. int main(){
  45. std::cout << std::boolalpha;
  46. std::cout << is_stl_container<std::vector<int>>::value << '\n';
  47. std::cout << is_stl_container<std::vector<int>const&>::value << '\n';
  48. std::cout << is_stl_container<int>::value << '\n';
  49. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
true
true
false