Size: a a a

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

2020 April 23

АК

Александр Караев... in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Ну вот, вполне без сеттера для index живётся
ну с таким же аргументом можно выпилить std::visit
источник

АК

Александр Караев... in cxx.Дискуссионная
Roy Mustang
а разве не нужно typename для шаблонных лямбд указывать перед тем как тип передавать?
хз, куда ты здесь собрался typename пихать, здесь нет зависимого контекста
источник

RM

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

АК

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

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Александр Караев
ну с таким же аргументом можно выпилить std::visit
Так а visit при чём?
Если вдруг зачем-то используешь сеттер index в variant (предположим, он существует), то ты должен тут же сконструировтать объект соответсвеющего типа
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Но если все равно объект нужного типа конструирешь, то тогда зачем сеттер index? variant сам ему нужный проставит
источник

АК

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

что-то вида
std::variant<Ts...> visit<std::size_t>(factory_that_returns_one_of_Ts)
источник

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

что-то вида
std::variant<Ts...> visit<std::size_t>(factory_that_returns_one_of_Ts)
Стоп, visit использует index только на чтение, о каком аналоге тогда речь, если мы про сеттер?
источник

АК

Александр Караев... in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Стоп, visit использует index только на чтение, о каком аналоге тогда речь, если мы про сеттер?
Ладно, сначала.

std::visit позволяет по рантайм size_t index = index() получить T& и с ним что-то сделать (принимая визитор)

другая ситуация - по рантайм size_t index вызвать визитор, который умеет возвращать любой T и сконструировать из него variant
источник

BH

Blue Heart in cxx.Дискуссионная
Roy Mustang
Эх, Серега, ты же не был таким, с Тиллем связался и испортился что ли?
Тиль норм
источник

RM

Roy Mustang in cxx.Дискуссионная
Blue Heart
Тиль норм
А ты еще кто? В первый раз тебя вижу
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Александр Караев
Ладно, сначала.

std::visit позволяет по рантайм size_t index = index() получить T& и с ним что-то сделать (принимая визитор)

другая ситуация - по рантайм size_t index вызвать визитор, который умеет возвращать любой T и сконструировать из него variant
Да, для второй ситуации нужно уметь:
1. В рантайме маппить runtime index на один шаблонный коллбек, соответствующий index-позиции в списке типов

И сеттер для этого не нужен
источник

АК

Александр Караев... in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Да, для второй ситуации нужно уметь:
1. В рантайме маппить runtime index на один шаблонный коллбек, соответствующий index-позиции в списке типов

И сеттер для этого не нужен
"сеттер" - это образно, конечно
источник

BH

Blue Heart in cxx.Дискуссионная
Roy Mustang
А ты еще кто? В первый раз тебя вижу
Мы ж уже выяснили
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Александр Караев
"сеттер" - это образно, конечно
А я именно про нечто вроде set_index, мутирующее только его, без остальной части variant
источник

АК

Александр Караев... in cxx.Дискуссионная
но если мы живём в теоретическом мире, где всё default constructible, то конечно всё решалось бы v.set_index(i)
источник

АК

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

RM

Roy Mustang in cxx.Дискуссионная
Александр Караев
Ладно, сначала.

std::visit позволяет по рантайм size_t index = index() получить T& и с ним что-то сделать (принимая визитор)

другая ситуация - по рантайм size_t index вызвать визитор, который умеет возвращать любой T и сконструировать из него variant
Разве это не создает больше сложности для std::visit?
источник

АК

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

АК

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