Как я могу сделать что-то вроде этого в C++:
void my_print(format_string) {
vector<string> data;
//Fills vector
printf(format_string, data);
}
my_print("%1$s - %2$s - %3$s");
my_print("%3$s - %2$s);
Я не объяснил задолго до того. Строка формата вводится пользователем приложения.
В C# это работает:
void my_print(format_string) {
List<string> data = new List<string>();
//Fills list
Console.WriteLine(format_string, data.ToArray);
}
my_print("{0} - {1} - {2}");
my_print("{2} - {1}");
Я временно решил с помощью этой функции:
string format_vector(string format, vector<string> &items)
{
int counter = 1;
replace_string(format,"\\n","\n");
replace_string(format,"\\t","\t");
for(vector<string>::iterator it = items.begin(); it != items.end(); ++it) {
ostringstream stm; stm << counter;
replace_string(format, "%" + stm.str(), *it);
counter++;
}
return format;
}
printf("%s - %s - %s", data[0].c_str(), data[1].c_str(), data[2].c_str() );
Обратите внимание, что вы должны преобразовать в строки в стиле C - printf не может этого сделать за вас.
Изменить: В ответ на ваш измененный вопрос, я думаю, вам придется самостоятельно проанализировать строку формата, так как вам придется ее проверить. printf () не справится с этой задачей.
Библиотека форматов ускорения может оказаться полезной.
#include <boost/format.hpp>
#include <vector>
#include <string>
#include <iostream>
int main(int arc, char** argv){
std::vector<std::string> array;
array.push_back("Hello");
array.push_back("word");
array.push_back("Hello");
array.push_back("again");
boost::format f("%s, %s! %s %s! \n");
f.exceptions( f.exceptions() &
~ ( boost::io::too_many_args_bit | boost::io::too_few_args_bit ) );
for (std::vector<std::string>::iterator i=array.begin();i!=array.end();++i){
f = f % (*i);
}
std::cout << f;
return 0;
}
Если вы собираетесь использовать потоки, вы также можете использовать ostream_iterator
в сочетании с конструкцией цикла, например copy
:
vector<string> data;
data.assign(10, "hello");
copy( &data[0], &data[3], ostream_iterator<string>(cout, " "));
Обратите внимание, что второй параметр для copy
указывает на один за концом. Вывод:
привет, привет, привет
Назовите те, которые хотите
printf("%1$s - %2$s - %3$s", date[0].c_str(), data[1].c_str(), data[2].c_str());
Думаю, вы хотите сделать следующее:
std :: vector
в va_list
из char *
s va_list
вместе со строкой формата, предоставленной пользователем, в vprintf
. Я до сих пор не знаю, как выполнить шаг 1. (Я точно знаю, что большинство языков более высокого уровня, таких как Java, Scala и Ruby, имеют для этого простое, безопасное и прямое преобразование. В C ++ нет ». t.)