|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
Всем привет! Споткнулся на ровном месте и что-то туплю с fold expression... Начну издалека Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
словами: есть класс, в конструктор которого можно передавать произвольные объекты (в нашем примере это int, но в реальности все несколько сложнее). Конструктор складывает переданные значения и сохраняет в переменной-члене класса value. Мне необходимо добавить к каждому переданному значению какое-то фиксированное число, в моем примере это 5. На выходе я ожидаю получить: 1 + 5 + 1 + 5 + 1 + 5 = 18 Приведенный выше код прекрасно работает по описанному сценарию для int'ов. Усложним задачу. Предположим, что value - это не int, а другой класс (назовем его concatenator), который умеет конкатенировать из любых (в разумных чертах) типов данных в общую строку. Я умышленно не привожу код concatenator'a ввиду его объема и сложности, в котором никто разбираться не будет. Но он у меня есть и он работает нормально. Пример, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
вместо 5, я подставляю к каждому аргументу точку с запятой, но у меня не получается достичь аналогичного результата как с int'ами. Если я использую concatenator напрямую Код: plaintext 1.
то результат нормальный и ожидаемый, я получаю строку - "a;b;c;" если же я использую вызов конструктора concatenator опосредовано, через summator (который должен сам добавить ';' , после каждого указанного аргумента), то на выходе я получаю строку состоящую только из точки с запятой . получается что я неправильно пишу выражение fold expression в данном случае? а как правильно написать его, чтобы получить тоже самое на входе конструктора, что и здесь Код: plaintext 1.
? PS или это какой-то баг компилятора тынц , тынц -------------------------------------------------------------- o(O_O)o ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 12:32 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
Вообще непонятно какая проблема решается. Зачем ты решил добавить точки с запятой? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 12:55 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
mayton Вообще непонятно какая проблема решается. Зачем ты решил добавить точки с запятой? для примера, к реальной задаче данный код имеет опосредованное отношение, но он ее описывает в удобном для анализа на форуме виде. Насколько это мне удалось, решать не мне, но я отвечу на любые вопросы, если что-то не понятно. Проблема, которую я пытаюсь решить, заключается в том, что мне не удается передать в конструктор объекта массив аргументов разделенных нужной мне вставкой, при помощи fold expression Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Чтобы такого еще придумать для наглядности... Ну вот возьмем к примеру CSV таблицу, в которой каждое значение в столбце разделено ; (точкой с запятой) Вам нужно передать только данные столбцов, а код сериализует их в CSV, подставив после каждого введенного значения символ-разделитель. Код: plaintext 1. 2. 3. 4.
так понятнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 13:15 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
Тебе принципиально, чтобы в шаблоне с VarArgs использовались разные типы параметров или у тебя все параметры одного и того же типа? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 13:30 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
Cerebrum Чтобы такого еще придумать для наглядности... Ну вот возьмем к примеру CSV таблицу, в которой каждое значение в столбце разделено ; (точкой с запятой) Вам нужно передать только данные столбцов, а код сериализует их в CSV, подставив после каждого введенного значения символ-разделитель. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 13:39 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
rdb_dev Тебе принципиально, чтобы в шаблоне с VarArgs использовались разные типы параметров или у тебя все параметры одного и того же типа? в реальной задаче - да, но с этим нет проблем, т.к. с задачей конвертации прекрасно справляется мой класс concatenator'a, он преобразует переданные ему данные к "общему знаменателю", например Код: plaintext 1. 2. 3.
то на выходе я получу "5-мама=3.14рама" и это работает! мне теперь хочется нахлабучить сверху механизм позволяющий вставлять произвольный разделитель между компонентами. И вроде как компилятор схавал мой код: Код: plaintext 1. 2. 3.
но вместо " 5;-мама;=;3.14;рама; ", я получаю только ";" вызов конструктора при этом сопровождается только передачей символа разделителя, как-будто fold expression криво разворачивается и вместо (arg1, arg2, arg3...., argN), я получаю некий аналог (argN), а запятая в данном случае это не разделитель аргументов конструктора (функции), а оператор, который просто перебрал все аргументы и впихнул последний. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 13:41 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
rdb_dev Зачем разделитель в конструктор-то фигачить? пример с CSV искусственный и приведен в качестве образца. мне не нужно хранить данные столбцов для таблицы CSV, это избыточно и неэффективно мне нужно сразу взять эти данные сформировать из них готовый объект и пустить его в обработку. поскольку используя variadic pack я могу получить сразу и всё: переданные значения и их типы, а также constexpr цикл с помощь fold expression, то я могу сразу произвести нужную мне обработку. И как показывает практика с int'aми это работает (потому что там оператор +, а не запятая) Если же использовать предложенный вами метод, то я должен буду сначала накопить эти данные в некий вектор, а при сериализации подставлять delimeter после каждой итерации, но мне нет смысла хранить эти данные. Я уже на этапе преобразования готов к их сериализации и именно она и происходит, так что плодить очередную копию данных особого смысла нет, нужно уже их записывать, либо передавать в какой-то транспорт в готовом виде мне проще будет отказаться от этой идеи и сразу пихать нужный мне разделитель руками, без автоматизации в виде нахлабучки summator'a. И это прекрасно работает, проверено и не однократно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 13:52 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 13:58 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
Cerebrum, Args должен быть последним параметром, это основное требование. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 14:08 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
rdb_dev Cerebrum, Args должен быть последним параметром, это основное требование. что имеется ввиду? Код: plaintext 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 14:11 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
Cerebrum, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 14:13 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
если так делаю, то в конструктор прилетает только последний Args ладно, забейте, руками прописывать разделитель буду спасибо за участие ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 14:14 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
rdb_dev Cerebrum, Args должен быть последним параметром, это основное требование. Cerebrum, ты в курсе про отличие оператора запятая от запятой в синтаксисе вызова функции? А то, что ты хочешь, делается так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 15:34 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
a guest Cerebrum, ты в курсе про отличие оператора запятая от запятой в синтаксисе вызова функции? конечно, написал уже об этом несколькими постами выше ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 15:54 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
a guest rdb_dev Cerebrum, Args должен быть последним параметром, это основное требование. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 15:58 |
|
fold expression и запятая (comma)
|
|||
---|---|---|---|
#18+
rdb_dev, тебя не поймёшь. Сначала ты пишешь про параметры, потом про аргументы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 16:53 |
|
|
start [/forum/topic.php?fid=57&fpage=6&tid=2017324]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 301ms |
total: | 432ms |
0 / 0 |