конструктор с переменным числом аргументов...

Тема в разделе "LANGS.C", создана пользователем cupuyc, 4 сен 2009.

  1. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    RedLord
    Попробуй значит начать с документации:
    Booster
    На практике обычно достаточно 2-5. Это не равноценная замена, а лучше, тип каждого аргумента проверяется при компиляции. То, о чем ты пишешь, заменяется std::vector<variant>, что бы не было неопределенности с кол-вом аргументов.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Продолжаем. ^). ...не проблема, проблема в кол-ве типов, тут стопитсот функциями не обойдёшься. Зачем мне смотреть на boost::bind? С форматированием строки оно ни как не коррелирует. Зациклились на типобезопасности.
     
  3. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Хотя, если сказать точнее, std::vector<variant> - это вариант реализации. В саму функцию вместо элипсов будет передаваться пара итераторов. 2 важных отличия: количество аргументов передаётся явно (с ним нельзя ошибиться) и нет необходимости копировать аргументы (упрощает оптимизацию).
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    J0E
    Еще итераторы не хватало передавать в формат строки.
     
  5. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    J0E
    ничего для конкатенации строк в компайл-тайм не увидел.

    там используется expression templates для отложенного вычисления выражения (в данном случае - конкатенации строк).
     
  6. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Booster
    Если не трогать форматирование, которое делается еще 58ю спосабами, можешь привисти пример необходимости элипсов?

    RedLord
    Гм... ты подумал, я имел ввиду литералы конкатенирует?
     
  7. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    чтобы спор не продолжался до бесконечности, попробую конкретизировать задачу. нужно сгенерировать xml заголовок, зная его имя и список опций, типа:

    <tag1 var1='val1' var2='val2' ... > </tag1>

    в коде получается что-то типа:

    Код (Text):
    1. CSomeString str;
    2. CSomeString tag_name;
    3.  
    4. ..
    5.  
    6. str = '<';
    7. str += tag_name;
    8.  
    9. for (i = 0; i < variables_count; i ++)
    10. {
    11.  str += ' ';
    12.  str += variable[i].get_name();
    13.  str += '=\'';
    14.  str += variable[i].get_value();
    15.  str += '\'';
    16. }
    17.  
    18. str += '>';
    или так:
    Код (Text):
    1. CSomeString str;
    2. CSomeString tag_name;
    3.  
    4. ..
    5.  
    6. str.format("<%s", tag_name);
    7.  
    8. for (i = 0; i < variables_count; i ++)
    9. {
    10.  str.append_format(" %s='%s'", variable[i].get_name(), variable[i].get_value());
    11. }
    12.  
    13. str += '>';
    второй вариант, по-моему, значительно проще выглядит и более читабелен. а если нужно сгенерировать более сложную структуру?
     
  8. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    J0E
    а что еще можно было понимать?
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    maksim_

    std::ofstream ofs(filename);
    boost::archive::xml_oarchive oa(ofs);
    oa << BOOST_SERIALIZATION_NVP(obj);


    Еще хорошо бы вспомнить, что для объектов, переданных в эллипсис, не будет вызван деструктор - его надо вызывать руками. Из этого следует, что не только типобезопасность, но и exception-сейфность идет в баню строевым шагом.
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    RedLordЯ понимаю это как перевод "Expression template for string concatenation operations"
    maksim_
    Тогда возьмем готовую XML либу ) В сложных случаях надо смотреть значение всех этих "%s" в документации и париться с соответствием 20ти параметров при изменении кода. Вот кстати как ты напишешь заголовок этой функции, variable явно не через эллипсы передаётся ) Твой пример опять же подтверждает, что место эллипсам - в простейщих случаях форматирования строк. append_format будет кстати реализован через vprintf и может быть легко написан без эллипсов.
     
  11. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Если бы я хотел взять готовую либу, я бы тему не создавал. Есть такое понятие - пример. Вот я привёл пример, в котором без форматного вывода не обойтись.
    Честно говоря, не понял что вы имеете ввиду. есть класс CSomeString, он сам генерирует строки. для склеивания строк + вывода чисел нужно ~5 идентефикаторов. конечно, не очень удобно пользоваться всеми этими идентефикаторами, но код получается понятнее, короче, хотя, по производительности, возможно, несколько уступает обычному склеиванию.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Я вообще не понимаю о чем тут базар. Есть std::stringstream. Есть boost::format. Есть boost::lexical_cast. Хрена ли вам еще надо? )))