Size: a a a

2020 May 11

IA

Igor Akhmetov in pro.cxx
ilynxy
если же bar(s0, a0, a1, s1, a2, ..., sN, aN...), то пока-что есть коллективное мнение, что не решается
Внутри функции сложите все параметры в tuple, найдите у какого параметра после первого тип S, откусите от tuple столько элементов, передайте их в нужную функцию, вызовитесь от оставшихся элементов рекурсивно.
источник

i

ilynxy in pro.cxx
Igor Akhmetov
Внутри функции сложите все параметры в tuple, найдите у какого параметра после первого тип S, откусите от tuple столько элементов, передайте их в нужную функцию, вызовитесь от оставшихся элементов рекурсивно.
Дада, так и сделано. А потом стало интересно, зачем можно делать несколько паков в шаблонах. Оказалось не для этого =)
источник

i

ilynxy in pro.cxx
Спасибо за информацию!
источник

ПК

Побитый Кирпич... in pro.cxx
ilynxy
если же bar(s0, a0, a1, s1, a2, ..., sN, aN...), то пока-что есть коллективное мнение, что не решается
Если сможешь вызывать функцию с произвольным "отрезком" аргументов, то получится и без таплов, но сходу пока не придумал как это сделать
источник

CD

Constantine Drozdov in pro.cxx
ilynxy
Давайте переформулируем задачу: на входе есть список параметров с типами (Args... args), как его разделить на две части, где разделителем выступает конкретный тип S. И вызвать две функции f0(S, то что после S...) и f1(то что перед S)
да как для массива в рантайме - нашли, сплитнули
источник

i

ilynxy in pro.cxx
@igor_akhmetov Если ответить развёрнуто и серьёзно: есть прекрасный fmt::print(format_string, args...);, однако легко запутаться, когда выводишь несколько неоднородных параметров: print("a = {}\n" "b = {}\n" "c = {}\n", a, b, c);. Особенно, когда там применяется сложное форматирование для каждого параметра. У fmt есть именованные параметры, это немного помогает. Чем хорош std::cout, там выводимый контекст расположен близко cout << "a = " << a << "\nb =" << b << "\nc =" << c << "\n"; Пример искусственны, но идея в том, что форматирование и то, что форматируется расположены рядом и это визуально легче воспринимается (по-крайней мере мной). Хорошо, если бы можно было писать fmt::print("a = {}\n"_fmt, a, "b = {}\n"_fmt, b, "c = {}\n"_fmt, c);. Да, можно это записать просто в несколько вызовов print, это наглядно. Однако тут вступает в силу синдром premature optimization: можно же сфолдить все ""_fmt в компл-тайме в одну строку и скормить это fmt::print за один вызов. Знаний, для того, чтобы это реализовать с разбега мне пока не хватает. Если мне сейчас дать готовый код — я, конечно, возрадуюсь, и буду пользоваться, но хочется разобраться в тонкостях самому.
источник

i

ilynxy in pro.cxx
И, наверняка, это где-нибудь уже реализовано, но с разбегу не нашёл.
источник

CD

Constantine Drozdov in pro.cxx
ilynxy
@igor_akhmetov Если ответить развёрнуто и серьёзно: есть прекрасный fmt::print(format_string, args...);, однако легко запутаться, когда выводишь несколько неоднородных параметров: print("a = {}\n" "b = {}\n" "c = {}\n", a, b, c);. Особенно, когда там применяется сложное форматирование для каждого параметра. У fmt есть именованные параметры, это немного помогает. Чем хорош std::cout, там выводимый контекст расположен близко cout << "a = " << a << "\nb =" << b << "\nc =" << c << "\n"; Пример искусственны, но идея в том, что форматирование и то, что форматируется расположены рядом и это визуально легче воспринимается (по-крайней мере мной). Хорошо, если бы можно было писать fmt::print("a = {}\n"_fmt, a, "b = {}\n"_fmt, b, "c = {}\n"_fmt, c);. Да, можно это записать просто в несколько вызовов print, это наглядно. Однако тут вступает в силу синдром premature optimization: можно же сфолдить все ""_fmt в компл-тайме в одну строку и скормить это fmt::print за один вызов. Знаний, для того, чтобы это реализовать с разбега мне пока не хватает. Если мне сейчас дать готовый код — я, конечно, возрадуюсь, и буду пользоваться, но хочется разобраться в тонкостях самому.
У меня лично горит от fmtlib, но это не относится к теме; на каком этапе возникает проблема? Реализовать index_sequence только [L; R)? Найти нужный индекс? Отделить самый левый вызов?
источник

i

ilynxy in pro.cxx
Constantine Drozdov
У меня лично горит от fmtlib, но это не относится к теме; на каком этапе возникает проблема? Реализовать index_sequence только [L; R)? Найти нужный индекс? Отделить самый левый вызов?
Да, такое решение вполне рабочее. Я, собственно, зашёл узнать как матчаца функции, если в списке шаблона несколько паков и нельзя ли это использовать.
источник

CD

Constantine Drozdov in pro.cxx
ilynxy
Да, такое решение вполне рабочее. Я, собственно, зашёл узнать как матчаца функции, если в списке шаблона несколько паков и нельзя ли это использовать.
А, сорри, это я совершенно не знаю, так как всегда можно программировать без этого
источник

i

ilynxy in pro.cxx
А почему бомбит от fmtlib?
источник

CD

Constantine Drozdov in pro.cxx
ilynxy
А почему бомбит от fmtlib?
Потому что расширение за счет специализации шаблонов - абсолютная ошибка дизайна
источник

i

ilynxy in pro.cxx
Constantine Drozdov
Потому что расширение за счет специализации шаблонов - абсолютная ошибка дизайна
Ничего не понял, наверное без детальных пояснений и не пойму. Но запомню, буду козырять при случае =)
источник

CD

Constantine Drozdov in pro.cxx
ilynxy
Ничего не понял, наверное без детальных пояснений и не пойму. Но запомню, буду козырять при случае =)
Ну посмотрите, как для пользовательского типа fmt расширяется. После этого посмотрите, с чем удобнее работать - с range-based for или с std::hash
источник

IA

Igor Akhmetov in pro.cxx
ilynxy
@igor_akhmetov Если ответить развёрнуто и серьёзно: есть прекрасный fmt::print(format_string, args...);, однако легко запутаться, когда выводишь несколько неоднородных параметров: print("a = {}\n" "b = {}\n" "c = {}\n", a, b, c);. Особенно, когда там применяется сложное форматирование для каждого параметра. У fmt есть именованные параметры, это немного помогает. Чем хорош std::cout, там выводимый контекст расположен близко cout << "a = " << a << "\nb =" << b << "\nc =" << c << "\n"; Пример искусственны, но идея в том, что форматирование и то, что форматируется расположены рядом и это визуально легче воспринимается (по-крайней мере мной). Хорошо, если бы можно было писать fmt::print("a = {}\n"_fmt, a, "b = {}\n"_fmt, b, "c = {}\n"_fmt, c);. Да, можно это записать просто в несколько вызовов print, это наглядно. Однако тут вступает в силу синдром premature optimization: можно же сфолдить все ""_fmt в компл-тайме в одну строку и скормить это fmt::print за один вызов. Знаний, для того, чтобы это реализовать с разбега мне пока не хватает. Если мне сейчас дать готовый код — я, конечно, возрадуюсь, и буду пользоваться, но хочется разобраться в тонкостях самому.
Мне лично кажется что второй вариант где перемешано форматирование и аргументы читается сильно хуже  первого (именно из-за перемешивания). В идеале должно быть конечно языковое решение вроде string interpolation в C# (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated). Частично вашу боль могла бы облегчить наверное поддержка со стороны IDE, которая бы для плейсхолдеров рисовала бы в тултипе или прямо в редакторе соответствующий аргумент.
источник

i

ilynxy in pro.cxx
Constantine Drozdov
Ну посмотрите, как для пользовательского типа fmt расширяется. После этого посмотрите, с чем удобнее работать - с range-based for или с std::hash
Это про то, что в родительском неймспесе объявляеца специализация (как и для std::hash)?
источник

CD

Constantine Drozdov in pro.cxx
Igor Akhmetov
Мне лично кажется что второй вариант где перемешано форматирование и аргументы читается сильно хуже  первого (именно из-за перемешивания). В идеале должно быть конечно языковое решение вроде string interpolation в C# (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated). Частично вашу боль могла бы облегчить наверное поддержка со стороны IDE, которая бы для плейсхолдеров рисовала бы в тултипе или прямо в редакторе соответствующий аргумент.
Хм... а на макросах такое не сделаешь? Макросы вроде тоже функциональны по Тьюрингу...
источник

i

ilynxy in pro.cxx
Igor Akhmetov
Мне лично кажется что второй вариант где перемешано форматирование и аргументы читается сильно хуже  первого (именно из-за перемешивания). В идеале должно быть конечно языковое решение вроде string interpolation в C# (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated). Частично вашу боль могла бы облегчить наверное поддержка со стороны IDE, которая бы для плейсхолдеров рисовала бы в тултипе или прямо в редакторе соответствующий аргумент.
У fmt есть именованые аргументы. Немного похоже и помогает.
источник

IA

Igor Akhmetov in pro.cxx
Constantine Drozdov
Хм... а на макросах такое не сделаешь? Макросы вроде тоже функциональны по Тьюрингу...
Не уверен что на макросах можно распарсить строчку :D
источник

CD

Constantine Drozdov in pro.cxx
Igor Akhmetov
Не уверен что на макросах можно распарсить строчку :D
Для gcc, вроде, там чудесные фокусы с марковскими алгоритмами за счет смещения запятой :) императив в основном, ФП в шаблонах, марковские алгоритмы в макросах - по-моему идеальный набор стилей программирования :)))))
источник