RedLord Попробуй значит начать с документации: Booster На практике обычно достаточно 2-5. Это не равноценная замена, а лучше, тип каждого аргумента проверяется при компиляции. То, о чем ты пишешь, заменяется std::vector<variant>, что бы не было неопределенности с кол-вом аргументов.
_DEN_ Продолжаем. ^). ...не проблема, проблема в кол-ве типов, тут стопитсот функциями не обойдёшься. Зачем мне смотреть на boost::bind? С форматированием строки оно ни как не коррелирует. Зациклились на типобезопасности.
Хотя, если сказать точнее, std::vector<variant> - это вариант реализации. В саму функцию вместо элипсов будет передаваться пара итераторов. 2 важных отличия: количество аргументов передаётся явно (с ним нельзя ошибиться) и нет необходимости копировать аргументы (упрощает оптимизацию).
J0E ничего для конкатенации строк в компайл-тайм не увидел. там используется expression templates для отложенного вычисления выражения (в данном случае - конкатенации строк).
Booster Если не трогать форматирование, которое делается еще 58ю спосабами, можешь привисти пример необходимости элипсов? RedLord Гм... ты подумал, я имел ввиду литералы конкатенирует?
чтобы спор не продолжался до бесконечности, попробую конкретизировать задачу. нужно сгенерировать xml заголовок, зная его имя и список опций, типа: <tag1 var1='val1' var2='val2' ... > </tag1> в коде получается что-то типа: Код (Text): CSomeString str; CSomeString tag_name; .. str = '<'; str += tag_name; for (i = 0; i < variables_count; i ++) { str += ' '; str += variable[i].get_name(); str += '=\''; str += variable[i].get_value(); str += '\''; } str += '>'; или так: Код (Text): CSomeString str; CSomeString tag_name; .. str.format("<%s", tag_name); for (i = 0; i < variables_count; i ++) { str.append_format(" %s='%s'", variable[i].get_name(), variable[i].get_value()); } str += '>'; второй вариант, по-моему, значительно проще выглядит и более читабелен. а если нужно сгенерировать более сложную структуру?
maksim_ std::ofstream ofs(filename); boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(obj); Еще хорошо бы вспомнить, что для объектов, переданных в эллипсис, не будет вызван деструктор - его надо вызывать руками. Из этого следует, что не только типобезопасность, но и exception-сейфность идет в баню строевым шагом.
RedLordЯ понимаю это как перевод "Expression template for string concatenation operations" maksim_ Тогда возьмем готовую XML либу ) В сложных случаях надо смотреть значение всех этих "%s" в документации и париться с соответствием 20ти параметров при изменении кода. Вот кстати как ты напишешь заголовок этой функции, variable явно не через эллипсы передаётся ) Твой пример опять же подтверждает, что место эллипсам - в простейщих случаях форматирования строк. append_format будет кстати реализован через vprintf и может быть легко написан без эллипсов.
Если бы я хотел взять готовую либу, я бы тему не создавал. Есть такое понятие - пример. Вот я привёл пример, в котором без форматного вывода не обойтись. Честно говоря, не понял что вы имеете ввиду. есть класс CSomeString, он сам генерирует строки. для склеивания строк + вывода чисел нужно ~5 идентефикаторов. конечно, не очень удобно пользоваться всеми этими идентефикаторами, но код получается понятнее, короче, хотя, по производительности, возможно, несколько уступает обычному склеиванию.
Я вообще не понимаю о чем тут базар. Есть std::stringstream. Есть boost::format. Есть boost::lexical_cast. Хрена ли вам еще надо? )))