Size: a a a

cxx.Дискуссионная

2020 April 23

RM

Roy Mustang in cxx.Дискуссионная
Александр Караев
у меня нет конкретных предложений, как это корректнее и удобнее всего реализовать, я лишь предъявил некоторые хотелки
Я вообще стараюсь избегать std::variant + std::visit
источник

RM

Roy Mustang in cxx.Дискуссионная
Помнится видел библиотеки дающие возможность использовать мета-теги, нельзя с их помощью что нибудь в constexpr соорудить?
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Александр Караев
просто несимметрично получается
Это ровно ассиметрия между статической и динамической диспетчеризацией
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Принципиально не устранимо
источник

АК

Александр Караев... in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Это ровно ассиметрия между статической и динамической диспетчеризацией
не, тут устранимая асимметрия между read и write
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Можно по-разному под ковёр прятать
источник

АК

Александр Караев... in cxx.Дискуссионная
Roy Mustang
Помнится видел библиотеки дающие возможность использовать мета-теги, нельзя с их помощью что нибудь в constexpr соорудить?
рой, не принимай близко к сердцу, но ты похоже немного выпал из контекста диалога
источник

АК

Александр Караев... in cxx.Дискуссионная
Roy Mustang
А весь код где можно глянуть?
кусок с сериализацией варианта
источник

RM

Roy Mustang in cxx.Дискуссионная
Александр Караев
рой, не принимай близко к сердцу, но ты похоже немного выпал из контекста диалога
Почему выпал то? Я предложил вариант из того что вспомнил, одна фича  в EnTT позволяет делать что-то типа тайпдефов, цепляя типы к именам (цеплять можно не только фундаментальные типы, но и классы и т.п.), зацепить несколько типов к определенному общему слово, а сверху попробовать мета-теги наложить и получится что-то типа type_"uint64_t", type_"string", правда я хз как это дело потом зацепить куда нибудь, как общий тип
источник

АК

Александр Караев... in cxx.Дискуссионная
Roy Mustang
Почему выпал то? Я предложил вариант из того что вспомнил, одна фича  в EnTT позволяет делать что-то типа тайпдефов, цепляя типы к именам (цеплять можно не только фундаментальные типы, но и классы и т.п.), зацепить несколько типов к определенному общему слово, а сверху попробовать мета-теги наложить и получится что-то типа type_"uint64_t", type_"string", правда я хз как это дело потом зацепить куда нибудь, как общий тип
и причём тут variant?
источник

RM

Roy Mustang in cxx.Дискуссионная
Александр Караев
и причём тут variant?
Я предложил замену variant'у
источник

АК

Александр Караев... in cxx.Дискуссионная
Roy Mustang
Я предложил замену variant'у
мне не нужна замена варианту, он отлично описывает ситуацию, когда требуется динамический полиморфизм на конечном множестве типов
источник

RM

Roy Mustang in cxx.Дискуссионная
Александр Караев
кусок с сериализацией варианта
А бинарь тестовый есть? Гляну что оно накомпилило
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Александр Караев
не, я подразумевал и смену самого значения (вместе с индексом)
Вообщем, поинт ясен. Да, был бы полезен хелпер для variant, который бы рантаймовый index маппил бы в тип и вызывал шаблонный функтор.
источник

АК

Александр Караев... in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Вообщем, поинт ясен. Да, был бы полезен хелпер для variant, который бы рантаймовый index маппил бы в тип и вызывал шаблонный функтор.
угу, visit - частный случай использования такого хелпера
источник

АК

Александр Караев... in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Вообщем, поинт ясен. Да, был бы полезен хелпер для variant, который бы рантаймовый index маппил бы в тип и вызывал шаблонный функтор.
std::visit(visitor, v)


превращается в

MAGIC(v.index(), []<std::size_t I>() {
  visitor(std::get<I>(v));
})
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Я с такой проблемой тоже в контексте сериализации сталкивался, писал руками, костыль назвал prelude::template_switch
источник

АК

Александр Караев... in cxx.Дискуссионная
мне советовали static_switch, но я остановился на runtime_unroll
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
При том у визита есть всё, что надо знать — список типов
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Вообще хорошо бы PR на эту тему запилить
источник