#cpp
Написать функцию ToString, которая список своих разнотипных аргументов преобразует в строковой значение (типа std::string). Длина списка произвольная. Например, для int n = 17; double x = 6.75; ToString(“;”, 25, 3.7, n, x) ; где “;” – разделитель между элементами, получим строковое значение “25;3.7;17;6.75”; Есть такое решение, но оно почему-то не может работать больше чем с одной переменной типа double. #include#include #include #include #include using namespace std; std::string a, c; std::string x_first, c_v, mn; int i = 0,u; char* ch, *ch1, *ch2; template std::string x_f(T&&t) { i++; if (typeid(t) == typeid(char)) { x_first += t; } else x_first += to_string(t); return x_first; } template std::string ToString(T&& t) { /*if (typeid(t) == typeid(char)) { char x[] = { t }; a += x; } else */ a = to_string(t); /*a.clear();*/ return a; } template std::string ToString(T&& t, Args&&... args) { a.clear(); if (i == 0) c_v = x_f(t); std::string b = (string)ToString(std::forward (args)...); if (typeid(t) == typeid(char)) { c = t; } else c = to_string(t); ch1 = (char*)c.c_str(); ch = (char *)b.c_str(); ch2 = (char*)c_v.c_str(); strcat(ch1, ch2); strcat(ch1, ch); //strcat(ch1, to_string(t).c_str()); mn = ch1; return mn; }; int main() { string my_x = ToString(';', 4.5,6.9, 8.4); auto h = [=](string x, string y) { return x.erase(0, 2 * strlen(y.c_str())); }; cout << h(my_x, x_first); return 0; }
Ответы
Ответ 1
В C++17 это можно будет сделать при помощи fold expression (выражения свертки): templatestd::string ToString(const T&... t) { std::stringstream ss; (ss << ... << t); return ss.str(); } В C++11 это делается через разворачивание пака в инициализаторе временного массива: template std::string ToString(const T&... t) { std::stringstream ss; int temp[] = {((ss << t), 0)...}; (void)temp; return ss.str(); } В выражении (ss << t), 0 используется оператор запятая, левая часть это сайд-эффект (запись в поток), правая часть - инициализатор элемента массива. Вместо массива можно использовать список инициализации: (void)std::initializer_list {((ss << t), 0)...}; Ответ 2
Ну, например: templatestring ToString(T t) { ostrstream os; os << t; return os.str(); } template string ToString(T t, P... p) { return [](auto a, auto b) { return ToString(a) + " " + ToString(b); } (t,ToString(p...)); } int main() { std::cout << ToString(2, 2.5, 'x', false, "rrr") << std::endl; }
Комментариев нет:
Отправить комментарий