fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <cstring>
  5.  
  6. template <typename Container>
  7. Container& do_safe_emplace(Container &c, const char *value)
  8. {
  9. std::cout << "do_safe_emplace(const char *)\n";
  10. if (value) c.emplace_back(value);
  11. return c;
  12. }
  13.  
  14. template <typename Container>
  15. Container& do_safe_emplace(Container &c, const typename Container::value_type &value)
  16. {
  17. std::cout << "do_safe_emplace(const value_type &)\n";
  18. c.emplace_back(value);
  19. return c;
  20. }
  21.  
  22. template <typename Container>
  23. Container& safe_emplace(Container &c)
  24. {
  25. return c;
  26. }
  27.  
  28. template <typename Container, typename T, typename... Args>
  29. Container& safe_emplace(Container &c, const T &value, Args... args)
  30. {
  31. do_safe_emplace(c, value);
  32. return safe_emplace(c, args...);
  33. }
  34.  
  35. template <typename Container, typename T>
  36. Container& safe_emplace(Container &c, const std::initializer_list<T> il)
  37. {
  38. std::cout << "safe_emplace(initializer_list)\n";
  39. for (auto& value: il)
  40. do_safe_emplace(c, value);
  41. return c;
  42. }
  43.  
  44. int main()
  45. {
  46. std::vector<std::string> svec;
  47.  
  48. char one[] = "string one";
  49. char two[] = "string two";
  50. char three[] = "string three";
  51. std::string four = "string four";
  52. char* d = new char[11];
  53. char* n = NULL;
  54.  
  55. std::strncpy(d, "0123456789", 11);
  56.  
  57. safe_emplace(svec, one); // char[]
  58. safe_emplace(svec, two, three, four); // variadic
  59. safe_emplace(svec, d); // char*
  60. safe_emplace(svec, n); // char* NULL
  61. safe_emplace(svec, "five", "four", std::string("three"), "two", "one", nullptr);
  62. safe_emplace(svec, {"A", "B", "C", "D", "E"} );
  63.  
  64. for (auto &s : svec)
  65. std::cout << s << "\n";
  66.  
  67. delete[] d; // clean up d (new)
  68.  
  69. return 0;
  70. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const value_type &)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const value_type &)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
safe_emplace(initializer_list)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
do_safe_emplace(const char *)
string one
string two
string three
string four
0123456789
five
four
three
two
one
A
B
C
D
E