Я заполняю строковый вектор из любого из char [] char * std :: string, помещая их в std :: vector
Этот код работает, но выглядит немного неуклюже и требует трех шаблонов дляпокрытия variadics и списков инициализаторов.
Есть ли более каноническая идиома для такого рода вещей?
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <stdexcept>
// safe function for putting char* strings into a std::vector<std::string>
template <typename T, typename C>
std::vector<T> & safe_emplace( std::vector<T>& vec, C& c)
{
if ( !c ) return vec;
vec.emplace_back(c);
return vec;
}
// variadic version
template <typename T, typename C, typename... Args>
std::vector<T> & safe_emplace( std::vector<T>& vec, C& c, Args... args)
{
safe_emplace(vec, c);
return safe_emplace( vec, args...);
}
// initializer list version
template <typename T>
std::vector<T> & safe_emplace( std::vector<T>& vec, const std::initializer_list<std::string> il)
{
for (auto& s: il)
vec.emplace_back(s);
return vec;
}
int main( int argc, char* argv[])
{
std::vector<std::string> svec;
char one[] = "string one";
char two[] = "string two";
char three[] = "string three";
char* d = new char[10];
char* n = NULL;
std::strncpy(d, "0123456789\0", 10);
safe_emplace(svec, one); // char[]
safe_emplace(svec, two, three); // variadic
safe_emplace(svec, d); // char*
safe_emplace(svec, n); // char* NULL
safe_emplace(svec, "five", "four", "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;
}
Я специально хотел разобраться со случаем NULL char *, который я решил пропуститьвместо создания пустой строки.
У меня была попытка / отлов для nullptr, но с шаблонами это было не нужно.