В настоящее время я работаю над функцией, аналогичной функции String.Format(...)
, из C#, только на C++. (String.Format(...))variadic macro для генерации вектора строк из коллекции неизвестных параметров
Но это не моя проблема. Функция работает нормально, но проблематично в том, что он принимает vector<string>
в качестве параметра, и если я хочу использовать целое число в качестве параметра, я должен написать такой код:
// function prototype, the function body is not relevant here
string format(string str, vector<string> variables);
// ... some context
// i could use to_string() here,
// but imagine a complex type which only overrides the stream operator
int a = 20;
stringstream ss;
ss << a;
string a_str = format("a has the value '{}'", { ss.str() });
Это совсем немного шаблонный код!
Таким образом, мне нужна функция, которая преобразует коллекцию неизвестных типов данных в vector<string>
.
Я попробовал несколько вещей, как это:
vector<string> vec_string(vector<void*> args) {
vector <string> result;
for (unsigned i = 0; i < args.size(); i++)
{
stringstream ss;
// I can't dereference an object without knowing to pointer type. :(
ss << *((int*)args[i]);
result.push_back(ss.str());
}
return result;
}
// ... some context
int a = 10;
cout << format("some int: '{}'", vec_string({ (void*) &a }));
который, очевидно, работает только для целых и очень неудобно. Я чувствую, что единственный способ сделать это: variadic macro, но я понятия не имел, как они работают.
here - ссылка на мой метод format(...)
. Прошу прощения за мое правописание, но я старался исправить его.
Посмотрите, что вы можете сделать с помощью 'std :: tuple',' std :: initializer_list' и 'std :: forward'. –
Матрицы Variadic - плохая идея здесь IMO, проверьте вариационные шаблоны для аналогичной функциональности в системе типа C++. –
Я читаю [это] (https://www.murrayc.com/permalink/2015/12/05/modern-c-variadic-template-parameters-and-tuples/) прямо сейчас, и кажется, что все вещь намного сложнее, чем я думал. –