Сообщение Re: Как узнать хранит ли variant... от 20.04.2025 6:51
Изменено 20.04.2025 7:10 rg45
Re: Как узнать хранит ли variant...
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Как узнать хранит ли variant шаблонный тип, где тип/типы, которыми инстанциирован шаблон, мне неизвестны?
M>Есть шаблонный функтор вида
M>
Ну, узнать можно через std::visit + функциональный класс с перегруженными функциональными операторами, часть из которых (или даже все) могут быть шаблонными.
Но только твой BasicFormatValueFilter — это же просто алиас, хоть и шаблонный. Его невозможно отличить от какого-нибудь совершенно левого шаблонного объявленния, сделанного похожим образом.
P.S. И вообще, объявление, подобное BasicFormatValueFilter, выгдлядит странным для меня. Обычно std::function используют тогда, когда нужно перейти от шаблонных функционалов к к функционалам с фиксированными типами формальных параметров и возвращаемого значения. И превращать это дело опять в шаблон — ну, это что-то совсем странное для меня. Ведь наложить на шаблоныый функционал какие-то констренты (хоть с концептами, хоть со SFINAE) можно, не прибегая к использованию std::function с её скрытым виртуальным вызовом.
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>
Ну, узнать можно через std::visit + функциональный класс с перегруженными функциональными операторами, часть из которых (или даже все) могут быть шаблонными.
Но только твой BasicFormatValueFilter — это же просто алиас, хоть и шаблонный. Его невозможно отличить от какого-нибудь совершенно левого шаблонного объявленния, сделанного похожим образом.
P.S. И вообще, объявление, подобное BasicFormatValueFilter, выгдлядит странным для меня. Обычно std::function используют тогда, когда нужно перейти от шаблонных функционалов к функционалам с фиксированными типами формальных параметров и возвращаемого значения. И превращать это дело опять в шаблон — ну, это что-то совсем странное для меня. Ведь наложить на шаблоныый функционал какие-то констренты (хоть с концептами, хоть со SFINAE) можно, не прибегая к использованию std::function с её скрытым виртуальным вызовом.
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 с её скрытым виртуальным вызовом.