#include <iostream>
#include <string>
#include <vector>
#include <cstring>
template <typename Container>
Container& do_safe_emplace(Container &c, const char *value)
{
std::cout << "do_safe_emplace(const char *)\n";
if (value) c.emplace_back(value);
return c;
}
template <typename Container>
Container& do_safe_emplace(Container &c, const typename Container::value_type &value)
{
std::cout << "do_safe_emplace(const value_type &)\n";
c.emplace_back(value);
return c;
}
template <typename Container>
Container& safe_emplace(Container &c)
{
return c;
}
template <typename Container, typename T, typename... Args>
Container& safe_emplace(Container &c, const T &value, Args... args)
{
do_safe_emplace(c, value);
return safe_emplace(c, args...);
}
template <typename Container, typename T>
Container& safe_emplace(Container &c, const std::initializer_list<T> il)
{
std::cout << "safe_emplace(initializer_list)\n";
for (auto& value: il)
do_safe_emplace(c, value);
return c;
}
int main()
{
std::vector<std::string> svec;
char one[] = "string one";
char two[] = "string two";
char three[] = "string three";
std::string four = "string four";
char* d = new char[11];
char* n = NULL;
std::strncpy(d, "0123456789", 11);
safe_emplace(svec, one); // char[]
safe_emplace(svec, two, three, four); // variadic
safe_emplace(svec, d); // char*
safe_emplace(svec, n); // char* NULL
safe_emplace(svec, "five", "four", std::string("three"), "two", "one", nullptr);
safe_emplace(svec, {"A", "B", "C", "D", "E"} );
for (auto &s : svec)
std::cout << s << "\n";
delete[] d; // clean up d (new)
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CkNvbnRhaW5lciYgZG9fc2FmZV9lbXBsYWNlKENvbnRhaW5lciAmYywgY29uc3QgY2hhciAqdmFsdWUpCnsKICAgIHN0ZDo6Y291dCA8PCAiZG9fc2FmZV9lbXBsYWNlKGNvbnN0IGNoYXIgKilcbiI7CiAgICBpZiAodmFsdWUpIGMuZW1wbGFjZV9iYWNrKHZhbHVlKTsKICAgIHJldHVybiBjOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgpDb250YWluZXImIGRvX3NhZmVfZW1wbGFjZShDb250YWluZXIgJmMsIGNvbnN0IHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZSAmdmFsdWUpCnsKICAgIHN0ZDo6Y291dCA8PCAiZG9fc2FmZV9lbXBsYWNlKGNvbnN0IHZhbHVlX3R5cGUgJilcbiI7CiAgICBjLmVtcGxhY2VfYmFjayh2YWx1ZSk7CiAgICByZXR1cm4gYzsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KQ29udGFpbmVyJiBzYWZlX2VtcGxhY2UoQ29udGFpbmVyICZjKQp7CiAgICByZXR1cm4gYzsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lciwgdHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KQ29udGFpbmVyJiBzYWZlX2VtcGxhY2UoQ29udGFpbmVyICZjLCBjb25zdCBUICZ2YWx1ZSwgQXJncy4uLiBhcmdzKQp7CiAgICBkb19zYWZlX2VtcGxhY2UoYywgdmFsdWUpOyAKICAgIHJldHVybiBzYWZlX2VtcGxhY2UoYywgYXJncy4uLik7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIFQ+CkNvbnRhaW5lciYgc2FmZV9lbXBsYWNlKENvbnRhaW5lciAmYywgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGlsKQp7CiAgICBzdGQ6OmNvdXQgPDwgInNhZmVfZW1wbGFjZShpbml0aWFsaXplcl9saXN0KVxuIjsKICAgIGZvciAoYXV0byYgdmFsdWU6IGlsKQogICAgICAgIGRvX3NhZmVfZW1wbGFjZShjLCB2YWx1ZSk7CiAgICByZXR1cm4gYzsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3ZlYzsKCiAgICBjaGFyIG9uZVtdID0gInN0cmluZyBvbmUiOwogICAgY2hhciB0d29bXSA9ICJzdHJpbmcgdHdvIjsKICAgIGNoYXIgdGhyZWVbXSA9ICJzdHJpbmcgdGhyZWUiOwogICAgc3RkOjpzdHJpbmcgZm91ciA9ICJzdHJpbmcgZm91ciI7CiAgICBjaGFyKiBkID0gbmV3IGNoYXJbMTFdOwogICAgY2hhciogbiA9IE5VTEw7CgogICAgc3RkOjpzdHJuY3B5KGQsICIwMTIzNDU2Nzg5IiwgMTEpOwoKICAgIHNhZmVfZW1wbGFjZShzdmVjLCBvbmUpOyAgIC8vIGNoYXJbXQogICAgc2FmZV9lbXBsYWNlKHN2ZWMsIHR3bywgdGhyZWUsIGZvdXIpOyAvLyB2YXJpYWRpYwogICAgc2FmZV9lbXBsYWNlKHN2ZWMsIGQpOyAgLy8gY2hhciogCiAgICBzYWZlX2VtcGxhY2Uoc3ZlYywgbik7IC8vIGNoYXIqIE5VTEwKICAgIHNhZmVfZW1wbGFjZShzdmVjLCAiZml2ZSIsICJmb3VyIiwgc3RkOjpzdHJpbmcoInRocmVlIiksICJ0d28iLCAib25lIiwgbnVsbHB0cik7CiAgICBzYWZlX2VtcGxhY2Uoc3ZlYywgeyJBIiwgIkIiLCAiQyIsICJEIiwgIkUifSApOwoKICAgIGZvciAoYXV0byAmcyA6IHN2ZWMpCiAgICAgIHN0ZDo6Y291dCA8PCBzIDw8ICJcbiI7CgogICAgZGVsZXRlW10gZDsgLy8gY2xlYW4gdXAgZCAobmV3KQoKICAgIHJldHVybiAwOwp9