@ProCxx

Страница 1225 из 2477
Square
18.08.2017
21:36:20
Alexander
18.08.2017
21:36:31
c клавы как ?

code example

Evgeniy
18.08.2017
21:37:02
ну типа ё в англ раскладке

Google
Alexander
18.08.2017
21:37:19
using azaza = template <char Delimiter = ',', char Quote='"'>

да, разобрался уже, спасибо

Evgeniy
18.08.2017
21:37:53
using azaza = template <char Delimiter = ',', char Quote='"'>
это вроде подобнее, не?

какие аргументы против?

Alexander
18.08.2017
21:38:52
какие аргументы против?
аргументы против - не всё можно через шаблон пихнуьт

пихнуть

Evgeniy
18.08.2017
21:39:04
это минус

Square
18.08.2017
21:39:04
using azaza = template <char Delimiter = ',', char Quote='"'>
Вариант с конкретными экземплярами и тайпдефами wtiter'а на них ловчее

Alexander
18.08.2017
21:39:08
может я хочу Quote как std::string="flkjhsdfljkfgsfjkljgjsdfklgjdfklgjdfklg"

Evgeniy
18.08.2017
21:39:55
может я хочу Quote как std::string="flkjhsdfljkfgsfjkljgjsdfklgjdfklgjdfklg"
но второй вариант юзабельней имхо

Alexander
18.08.2017
21:40:00
Вариант с конкретными экземплярами и тайпдефами wtiter'а на них ловчее
да, я прекрасно понимаю, что такой подход очень гибкий получается и он мне нравится больше. Но с ним возникает проблема, как наиболее грамотно дать пользователю предефаненые типы для работы с TSV, CSV?

Evgeniy
18.08.2017
21:40:15
можно туплу пихнуть

Google
Evgeniy
18.08.2017
21:40:26
или нет?

Alexander
18.08.2017
21:40:56
и мне внутри кода специально иметь кейс для std::ofstream « std::tuple?

тупл же не умеет выводиться, да?

или умеет?

Alexander
18.08.2017
21:43:21
в смысле?
ну окей, мне пришёл шаблонным параметром std::tuple. как мне его вывести в поток?

Александр
18.08.2017
21:44:46
Если книгу Шлее купить не советуете и говорите что это "унылое чтиво", а также что кути часто обновляется, то позвольте спросить: как освоить эту самую кути?

Evgeniy
18.08.2017
21:47:30
Alexander
18.08.2017
21:48:02
ну так же как ты и по отдельности бы их выводил
std::ofstream « std::make_tuple (1,2,3); Работает?

Vladislav
18.08.2017
21:49:08
std::ofstream « std::make_tuple (1,2,3); Работает?
с мой библиотечкой для олимпиадок будет

Alexander
18.08.2017
21:49:23
с мой библиотечкой для олимпиадок будет
ну так просто перегрузку делаешь и окей, не спорю

Vladislav
18.08.2017
21:49:25
у меня там и std::hash для туплов/коллекций есть

Alexander
18.08.2017
21:49:31
а так мне надо будет распаковывать

Evgeniy
18.08.2017
21:49:38
std::ofstream « std::make_tuple (1,2,3); Работает?
std::ofstream << std::get<0>(x) << std::get<1>(x) ...

Alexander
18.08.2017
21:49:43
да блять

вот скажи, у меня генерализованный код, всё ок. И мне отдельную ветку для тупла писать?

а так у меня прилетает абсолютно любое говно на вход, и у меня к нему только одно требование - уметь в std::ofstream.operator«

Google
Evgeniy
18.08.2017
21:51:22
ну тогда ебашь первый вариант

если тебе это необходимо

Alexander
18.08.2017
21:53:15
во, но может кто-то подскажет тогда, как мне пользователю предоставить как можно приятнее уже готовые типы для работы с форматами разными?

Square
18.08.2017
22:04:05
А готовые тайпдефы типа не подходят?

Тип как со строками в стд

Alexander
18.08.2017
22:04:56
вот пока ты писал, я тоже подумал, что можно конечно так сделать...

то есть типа вот так

Square
18.08.2017
22:05:34
Ну я вот это же самое имел ввиду :(

Вариант с конкретными экземплярами и тайпдефами wtiter'а на них ловчее

Alexander
18.08.2017
22:06:28
так, я запутался. Ещё раз - конкретный тайпдеф не сделаешь, если мы имеем сигнатуру диалекта вида

`template <typename Delimiter, typename LineTerminator, typename Quote, typename Comment> struct Dialect { using DelimiterType = Delimiter; using LineTerminatorType = LineTerminator; using QuoteType = Quote; using CommentType = Comment; Dialect(Delimiter delimiter1, LineTerminator lineTerminator1, Quote quote1, Comment comment1) : delimiter(delimiter1), lineTerminator(lineTerminator1), quote(quote1), comment(comment1) {} Delimiter delimiter; LineTerminator lineTerminator; Quote quote; Comment comment; };`

Alexander
18.08.2017
22:06:57
то есть так вот не получится сделать

Square
18.08.2017
22:08:01
то есть так вот не получится сделать
А диалект инстанцировать ?

Alexander
18.08.2017
22:08:43
А диалект инстанцировать ?
а это уже создание обьекта

Square
18.08.2017
22:09:06
Грязь типа? Ну а как ещё тут быть?

Alexander
18.08.2017
22:09:11
то есть видишь - в таком варианте мы имеем гибкость, но все эти знаки выходят за границы типа

Грязь типа? Ну а как ещё тут быть?
второй вариант заключался в том, чтобы запихунть все эти знаки в сам тип Диалекта. Но так получается люто негибко

Google
Alexander
18.08.2017
22:10:19
Грязь типа? Ну а как ещё тут быть?
ну вот, такой вариант и остаётся: проинстанциоровать парочку готовых диалектов

Ну вариантов диалекта не так уж много будет по сути
это не беда, что их много. Я дам только парочку пользователю, а там чуть что - пусть сам пишет. Это не проблема

Проблема вот в чём: Есть диалект. И теперь пользователю нужно работать с CSV. Как ему обьявить CSVreader с таким вот решением?

Square
18.08.2017
22:11:18
Вспомнился один пиздец https://github.com/brofield/simpleini/blob/master/SimpleIni.h

Admin
ERROR: S client not available

Alexander
18.08.2017
22:12:09
как-то так GeneralReader<column_count> reader(CSVdialect);

а я хотел вот так: GeneralReader<column_count, CSVdialect> reader;

но второй вариант как-то не получается, как видите. Если есть идеи, как свести ко второму варианту - я слушаю

Но у меня никак не получилось без падения гибкости

Ioann V
18.08.2017
22:54:31
Зайцев, если не сложно можешь коротко обрисовать что нужно.

Или переслать что нужно из чата

Я кажется сталкивался с подобной фичей

Какая прелесть
О, моя школа :)

Alexander
19.08.2017
03:10:02
Зайцев, если не сложно можешь коротко обрисовать что нужно.
да, хорошо. Потому что чувствую, что немного сумбурно вышло. Внимание, длиннопост. Итак, для чего это нужно. Обычная либа с CSV форматом. Почему не взял готовое? Потому что всё, что я нашёл готовое - говно. Это один из немногих случаев, когда приходится садиться за написание своего качественного велосипеда и доведения его до ума. В чём суть либы (конкретно сейчас мы говорим только про часть либы, но не суть): есть класс для записи DSV-like файлов. DSV-like - это CSV, TSV, SCSV и так далее - что придумаете похожее, то и будет писать. Что мы можем в аднном случае конфигурировать? О, список довольно большой: - Символ(строка)-разделитель - Символ(строка)-кавычка - Символ(строка) конца линии - Символ(строка) комментария - Символ(строка) для тримминга - Policy для выставления кавычек (то есть как ставим кавычки: всегда или только на те поле, которые без кавычек нельзя выводить. А может быть только на не числовые значения? простор для фанатзии велик) - Policy для тримминга (триммим всё в строке, или только начало, или только конец. Или вообще не тримим) И это вроде как не всё (я скорее всего что-то забыл). Почему так много? Потмоу что я пишу велосипеды обощённые и не хочу, чтобы кому-то пришлось ещё раз писать всю эту дрянь. Итак, у нас есть столько параметров, и нам нужно как-то запихнуть их в класс Writer. Окей, как? На ум приходит нескольно вариантов: 1) template <typename Delimiter, typename Quote, ...> class Writer{bla-bla-bla}; Какая здесь проблема? Всё очень просто - Вы не сможете передать сами символы сепараторы, кавычки и так далее через параметры шаблона, вы только можете указать их типы. А сами символы вам придётся передавать уже в конструкторе, сохранять их внутри класса и работать с ними. Выглядеть это будет вот так: Writer<char,char> writer(',', '"'); К тому же, если Вы хотите предоставить пользователю уже готовый класс для работы с тем же TSV (а в TSV в качестве сепаратора используется \t, то у вас не получится обьявить такой ТИП (так как мы не можем символы пихать в тип, потому что у нас везде typename, а не char,int,etc.)). Нам придётся давать пользователю уже готовые ОБЬЕКТЫ для работы с этим, чего делать бы очень не хотелось (так как нам же надо тогда давать интерфейс допольнительный для установки выходного потока, так как обьект уже есть). ДА и вообще, готовый обьект - дерьмо. Пользователь должен сам создать Writer тогда, когда ОН хочет, а не я. А я должен дать ему макисльно удобные средства для этого. Вариант мне нравится. 2) template <char Delimiter, char Quote, ...> class Writer{bla-bla-bla}; Сразу отметаем, так как мы тут привязываемся к типам, которые я задам. А если пользователь захочет wchar_t или ещё какую-нибудь свою штуку, которая будет нормально выводится? Сразу отметаем. 3) Улучшение первого варианта через трейты template <typename Dialect> class Writer{bla-bla-bla}; Всё остаётся по аналогии с первым пунктом, только теперь у нас есть набор предефайненых трейтов для разных случаев жизни: TSV, CSV, SCSV, что-нибудь ещё (трейты эти я дам пользователю сам). Если пользователю не понравится, он всегда сам сможет сделать свой трейт и подпихнуть его в мой Writer. (вот пример, как это примерно будет выглядеть: https://pastebin.com/ETfS7r4K) Проблема в том, что снова же обьекты уже трейта будут предефайнены, потому что снова же мы внутренности их инициализируем не в типе шаблона, а уже в конструкторе (подпихиваем, что там за символы внутри будут) Мне этот вариант нравится больше всего. Что скажете?

Ilia
19.08.2017
04:19:41
И почему же у тебя Delimiter и так далее - шаблонный параметр -ТИП , а не хотя бы шаблонный параметр - значение?

Vladislav
19.08.2017
04:23:56
А, тут символы только

Тогда непонятно

Ilia
19.08.2017
04:25:11
Возможно, я не загрузился ещё?

Google
Ilia
19.08.2017
04:25:28
Да не, все верно

Варианта (2) достаточно. Задавай все разделители в виде простой либо широкой строки, и все. Это будет достаточно.

Alexander
19.08.2017
05:35:53
А кто сказал, что строки можно в шаблоны?

Может я хочу, чтобы комментарии начинались с std::u32_string

Если определю как шаблонный параметр значение, то пользователь не сможет поменять тип его

Я надеюсь, что все поняли, почему я склоняюсь к третьему варианту

Evgeniy
19.08.2017
08:38:45
да, хорошо. Потому что чувствую, что немного сумбурно вышло. Внимание, длиннопост. Итак, для чего это нужно. Обычная либа с CSV форматом. Почему не взял готовое? Потому что всё, что я нашёл готовое - говно. Это один из немногих случаев, когда приходится садиться за написание своего качественного велосипеда и доведения его до ума. В чём суть либы (конкретно сейчас мы говорим только про часть либы, но не суть): есть класс для записи DSV-like файлов. DSV-like - это CSV, TSV, SCSV и так далее - что придумаете похожее, то и будет писать. Что мы можем в аднном случае конфигурировать? О, список довольно большой: - Символ(строка)-разделитель - Символ(строка)-кавычка - Символ(строка) конца линии - Символ(строка) комментария - Символ(строка) для тримминга - Policy для выставления кавычек (то есть как ставим кавычки: всегда или только на те поле, которые без кавычек нельзя выводить. А может быть только на не числовые значения? простор для фанатзии велик) - Policy для тримминга (триммим всё в строке, или только начало, или только конец. Или вообще не тримим) И это вроде как не всё (я скорее всего что-то забыл). Почему так много? Потмоу что я пишу велосипеды обощённые и не хочу, чтобы кому-то пришлось ещё раз писать всю эту дрянь. Итак, у нас есть столько параметров, и нам нужно как-то запихнуть их в класс Writer. Окей, как? На ум приходит нескольно вариантов: 1) template <typename Delimiter, typename Quote, ...> class Writer{bla-bla-bla}; Какая здесь проблема? Всё очень просто - Вы не сможете передать сами символы сепараторы, кавычки и так далее через параметры шаблона, вы только можете указать их типы. А сами символы вам придётся передавать уже в конструкторе, сохранять их внутри класса и работать с ними. Выглядеть это будет вот так: Writer<char,char> writer(',', '"'); К тому же, если Вы хотите предоставить пользователю уже готовый класс для работы с тем же TSV (а в TSV в качестве сепаратора используется \t, то у вас не получится обьявить такой ТИП (так как мы не можем символы пихать в тип, потому что у нас везде typename, а не char,int,etc.)). Нам придётся давать пользователю уже готовые ОБЬЕКТЫ для работы с этим, чего делать бы очень не хотелось (так как нам же надо тогда давать интерфейс допольнительный для установки выходного потока, так как обьект уже есть). ДА и вообще, готовый обьект - дерьмо. Пользователь должен сам создать Writer тогда, когда ОН хочет, а не я. А я должен дать ему макисльно удобные средства для этого. Вариант мне нравится. 2) template <char Delimiter, char Quote, ...> class Writer{bla-bla-bla}; Сразу отметаем, так как мы тут привязываемся к типам, которые я задам. А если пользователь захочет wchar_t или ещё какую-нибудь свою штуку, которая будет нормально выводится? Сразу отметаем. 3) Улучшение первого варианта через трейты template <typename Dialect> class Writer{bla-bla-bla}; Всё остаётся по аналогии с первым пунктом, только теперь у нас есть набор предефайненых трейтов для разных случаев жизни: TSV, CSV, SCSV, что-нибудь ещё (трейты эти я дам пользователю сам). Если пользователю не понравится, он всегда сам сможет сделать свой трейт и подпихнуть его в мой Writer. (вот пример, как это примерно будет выглядеть: https://pastebin.com/ETfS7r4K) Проблема в том, что снова же обьекты уже трейта будут предефайнены, потому что снова же мы внутренности их инициализируем не в типе шаблона, а уже в конструкторе (подпихиваем, что там за символы внутри будут) Мне этот вариант нравится больше всего. Что скажете?
ты забыл символ для escape

Alexander
19.08.2017
09:35:16
ты забыл символ для escape
Да, точно. Спасибо

Evgeniy
19.08.2017
09:37:06
Да, точно. Спасибо
но вообще имхо первый вариант норм

как в питоне)

Alexander
19.08.2017
09:40:39
как в питоне)
С него и делается:)

Потому что сделано адекватно

Evgeniy
19.08.2017
10:08:47
С него и делается:)
ну может тогда нет смысла усложнять с шаблонными параметрами

Страница 1225 из 2477