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

Сообщение Как узнать хранит ли variant... от 19.04.2025 18:33

Изменено 19.04.2025 18:35 Marty

Как узнать хранит ли variant...
Здравствуйте!

Как узнать хранит ли variant шаблонное значение, где аргумент мне неизвестен?

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

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


Есть специализация
using FormatValueFilter = BasicFormatValueFilter< marty::utf::UtfInputIterator<char>
                                                , marty::utf::UtfOutputIterator<char>
                                                >;


Есть стандартный вариант
  FormatArgumentVariant
using FormatArgumentVariant = 
    std::variant< bool
                , char
                , unsigned char        // std::uint8_t
                , signed char          // std::int8_t
                , unsigned short       // std::uint16_t
                , signed short         // std::int16_t
                , unsigned int         // std::uint32_t
                , int                  // std::int32_t
                , unsigned long        // 32/64, it's depends
                , long                 // 32/64, it's depends
                , unsigned long long   // std::uint64_t
                , long long            // std::int64_t
                , float
                , double
                , long double
                , const char*
                , const wchar_t*
                , std::string
                , std::wstring
                , marty::Decimal
                , FormatValueFilter
                >;



Есть моя шаблонная функция, которая принимает контейнер вариантов, но там могут лежать не мои стандартные варианты, а пользовательские, в тч в пользовательском варианте могут лежать как функторы FormatValueFilter, так пользовательские типы функторов на базе BasicFormatValueFilter.

Вопросы такие.

1. Мне надо узнать, есть ли в варианте, который хранит контейнер, что-либо на базе BasicFormatValueFilter, и получить его точный тип
2. Проверить, является ли текущее значение варианта экземпляром функтора

Сначала был второй вопрос, но пока размышлял, появился и первый, и если по второму есть кой-какие идеи, то по первому что-то ничего в голову не приходит
Как узнать хранит ли variant...
Здравствуйте!

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

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

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


Есть специализация
using FormatValueFilter = BasicFormatValueFilter< marty::utf::UtfInputIterator<char>
                                                , marty::utf::UtfOutputIterator<char>
                                                >;


Есть стандартный вариант
  FormatArgumentVariant
using FormatArgumentVariant = 
    std::variant< bool
                , char
                , unsigned char        // std::uint8_t
                , signed char          // std::int8_t
                , unsigned short       // std::uint16_t
                , signed short         // std::int16_t
                , unsigned int         // std::uint32_t
                , int                  // std::int32_t
                , unsigned long        // 32/64, it's depends
                , long                 // 32/64, it's depends
                , unsigned long long   // std::uint64_t
                , long long            // std::int64_t
                , float
                , double
                , long double
                , const char*
                , const wchar_t*
                , std::string
                , std::wstring
                , marty::Decimal
                , FormatValueFilter
                >;



Есть моя шаблонная функция, которая принимает контейнер вариантов, но там могут лежать не мои стандартные варианты, а пользовательские, в тч в пользовательском варианте могут лежать как функторы FormatValueFilter, так пользовательские типы функторов на базе BasicFormatValueFilter.

Вопросы такие.

1. Мне надо узнать, есть ли в варианте, который хранит контейнер, что-либо на базе BasicFormatValueFilter, и получить его точный тип
2. Проверить, является ли текущее значение варианта экземпляром функтора

Сначала был второй вопрос, но пока размышлял, появился и первый, и если по второму есть кой-какие идеи, то по первому что-то ничего в голову не приходит