Информация об изменениях

Сообщение Re: Как узнать хранит ли variant... от 20.04.2025 6:51

Изменено 20.04.2025 7:04 rg45

Re: Как узнать хранит ли variant...
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Как узнать хранит ли variant шаблонный тип, где тип/типы, которыми инстанциирован шаблон, мне неизвестны?


M>Есть шаблонный функтор вида


M>
M>template<typename InputIteratorType, typename OutputIteratorType>
M>using BasicFormatValueFilter = std::function< OutputIteratorType( InputIteratorType  // begin
M>                                                                , InputIteratorType  // end
M>                                                                , OutputIteratorType
M>                                                                )
                                            >>;
M>


Ну, узнать можно через std::visit.

Но только твой BasicFormatValueFilter — это же просто алиас, хоть и шаблонный. Его невозможно отличить от какого-нибудь совершенно левого шаблонного объявленния, сделанного похожим образом.

template<typename Foo, typename Bar>
using Baz = std::function<Bar(Foo, Foo, Bar)>;

static_assert(std::same_as<
   Baz<int, int, double>
,  BasicFormatValueFilter<int, int, double>
>);



P.S. И вообще, объявление, подобное BasicFormatValueFilter, выгдлядит странным для меня. Обычно std::function используют тогда, когда нужно перейти от шаблонных функционалов к к функционалам с фиксированными типами формальных параметров и возвращаемого значения. И превращать это дело опять в шаблон — ну, это что-то совсем странное для меня. Ведь наложить на шаблоныый функционал какие-то констренты (хоть с концептами, хоть со SFINAE), можно не прибегая к использованию std::function с её скрытым виртуальным вызовом.
Re: Как узнать хранит ли variant...
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Как узнать хранит ли variant шаблонный тип, где тип/типы, которыми инстанциирован шаблон, мне неизвестны?


M>Есть шаблонный функтор вида


M>
M>template<typename InputIteratorType, typename OutputIteratorType>
M>using BasicFormatValueFilter = std::function< OutputIteratorType( InputIteratorType  // begin
M>                                                                , InputIteratorType  // end
M>                                                                , OutputIteratorType
M>                                                                )
                                            >>;
M>


Ну, узнать можно через std::visit.

Но только твой BasicFormatValueFilter — это же просто алиас, хоть и шаблонный. Его невозможно отличить от какого-нибудь совершенно левого шаблонного объявленния, сделанного похожим образом.

template<typename Foo, typename Bar>
using Baz = std::function<Bar(Foo, Foo, Bar)>;

static_assert(std::same_as<
   Baz<int, int, double>
,  BasicFormatValueFilter<int, int, double>
>);



P.S. И вообще, объявление, подобное BasicFormatValueFilter, выгдлядит странным для меня. Обычно std::function используют тогда, когда нужно перейти от шаблонных функционалов к к функционалам с фиксированными типами формальных параметров и возвращаемого значения. И превращать это дело опять в шаблон — ну, это что-то совсем странное для меня. Ведь наложить на шаблоныый функционал какие-то констренты (хоть с концептами, хоть со SFINAE) можно, не прибегая к использованию std::function с её скрытым виртуальным вызовом.