170 похожих чатов

Только вы это можете знать. Как получить специализацию, если шаблонный

параметр наследуется от некоторого шаблонного класса?

43 ответов

7 просмотров

Получить в плане?

Ramil-Rizvanov Автор вопроса
Слава
Получить в плане?

template <typename T> class UdpServer { }; template <typename T, typename R> class UdpServer<IController<T,R>> { по понятным причинам это не будет работать, но нужно чтобы эта специализация касалась всех наследников IController

Ramil Rizvanov
template <typename T> class UdpServer { }; ...

Все ещё непонятно в чем проблема

Ramil-Rizvanov Автор вопроса
Слава
Все ещё непонятно в чем проблема

нужно сделать эту специализацию, как ещё объяснить?

Слава
Сделай сфинае

Если я правильно понял с условием наследования

Ramil-Rizvanov Автор вопроса
Слава
Сделай сфинае

уже думал про свиную, но не пойму куда её всунуть(

Ramil Rizvanov
уже думал про свиную, но не пойму куда её всунуть(

template <typename T> class UdpServer { }; template <typename T, typename = std::enable_if_t<std::is_base_of<IController, T>>> class UdpServer<T> {}; Что-нибудь такое. Только проблема в том, что видимо IController тоже шаблонный и там могут быть разные параметры

Ramil-Rizvanov Автор вопроса
Слава
template <typename T> class UdpServer { }; te...

IController шаблонный, и эти параметры шаблона нужно бы получить тоже

Ramil Rizvanov
IController шаблонный, и эти параметры шаблона нуж...

Ну ты их не выведешь из типа наследника. Так что никак. Либо какой-нибудь тэг вводить.

Слава
Ну ты их не выведешь из типа наследника. Так что н...

struct Der : public IController<int, int>, IControllerTag {}; Может есть что адекватнее

Слава
struct Der : public IController<int, int>, IContro...

IControllerTag можно в IController запихнуть в наследовании

Ramil-Rizvanov Автор вопроса
Слава
Ну ты их не выведешь из типа наследника. Так что н...

тоже склоняюсь что никак, всегда считал что шаблоны могут все(

Ramil Rizvanov
тоже склоняюсь что никак, всегда считал что шаблон...

Шаблоны могут почти всё. Механизм вывода типов - нет

Ramil-Rizvanov Автор вопроса
Alexander Karaev
Шаблоны могут почти всё. Механизм вывода типов - н...

Вы тоже считаете что в общем виде это не разрешимо?

Ramil Rizvanov
тоже склоняюсь что никак, всегда считал что шаблон...

struct IControllerTag{}; template<class, class> struct IController : IControllerTag {}; template <typename T> class UdpServer { }; template <typename T, typename = std::enable_if_t<std::is_base_of<IControllerTag, T>>> class UdpServer<T> {};

Слава
struct IControllerTag{}; template<class, class> s...

Хз чем тебя не устраивает такое решение

Ramil-Rizvanov Автор вопроса
Слава
struct IControllerTag{}; template<class, class> s...

Ну не получим же параметры IController

Ramil Rizvanov
Ну не получим же параметры IController

Через тайпдефы внутри класса?

Ramil Rizvanov
Ну не получим же параметры IController

Получить параметры - не проблема. Концепты доступны, кстати?

Ramil-Rizvanov Автор вопроса
Слава
Через тайпдефы внутри класса?

Для этого же скастовать нужно?

Ramil Rizvanov
Для этого же скастовать нужно?

https://godbolt.org/z/Maj1o1hPs нет вроде

Ramil Rizvanov
тоже склоняюсь что никак, всегда считал что шаблон...

https://godbolt.org/z/6qvsK7Mfs https://godbolt.org/z/o7P996fch Реализация без тегов

Ramil-Rizvanov Автор вопроса
Alexander Karaev
https://godbolt.org/z/6qvsK7Mfs https://godbolt.or...

https://godbolt.org/z/7jGq4a59G не подскажите Александр, почему тут сфинае не врубается?

Ramil Rizvanov
https://godbolt.org/z/7jGq4a59G не подскажите Алек...

template<typename TT> struct UDPServer<TT, decltype(carg(std::declval<TT&>()), void()), decltype(cret(std::declval<TT&>()), void())> { using in_t = decltype(carg(std::declval<TT&>())); using out_t = decltype(cret(std::declval<TT&>())); };

Alexander Karaev
template<typename TT> struct UDPServer<TT, decltyp...

template<typename TT, typename=void> struct UDPServer {} ; template<typename TT> struct UDPServer<TT, std::void_t<decltype(carg(std::declval<TT&>())), decltype(cret(std::declval<TT&>()))>> { using in_t = decltype(carg(std::declval<TT&>())); using out_t = decltype(cret(std::declval<TT&>())); }; Нет?

Alexander Karaev
Можно и так

А есть вариант же не засорять шаблонные параметры

Слава
А есть вариант же не засорять шаблонные параметры

До концептов без , typename = void> не обойтись, как я знаю

Ramil Rizvanov
https://godbolt.org/z/7jGq4a59G не подскажите Алек...

А вообще, точно ли тут нужно SFINAE? Если нужно просто фейлить компиляцию для всех контроллеров, которые не IController<T, U>, то вся эта мешанина не нужна

Ramil-Rizvanov Автор вопроса
Alexander Karaev
А вообще, точно ли тут нужно SFINAE? Если нужно пр...

цель реализовать контроллер у которого шаблонный аргумент наследник IController и при этом заиметь параметры этого IController

Ramil Rizvanov
цель реализовать контроллер у которого шаблонный а...

Тогда достаточно template <typename TT> struct UDPServer { using in_t = decltype(carg(std::declval<TT&>())); using out_t = decltype(cret(std::declval<TT&>())); };

Ramil-Rizvanov Автор вопроса
Слава
template<typename TT, typename=void> struct UDPSer...

мне теперь не дает покоя другое, что в decltype в конце должен быть , void()

Ramil Rizvanov
мне теперь не дает покоя другое, что в decltype в ...

void() в моём примере нужен, чтобы decltype(...) в итоге вычислялся в void и специализация вычислилась в UDPServer<TT, void, void>, а не в какое-нибудь UDPServer<TT, int, float>

Ramil-Rizvanov Автор вопроса
Ramil Rizvanov
а чем UDPServer<TT, int, float> плох?

Тем, что это будет не та специализация. UDPServer<TT> фактически имеет тип UDPServer<TT, void, void> благодаря дефолтным шаблонным параметрам, что не совпадает со специализацией UDPServer<TT, int, float>

Ramil-Rizvanov Автор вопроса
Alexander Karaev
Тем, что это будет не та специализация. UDPServer<...

то есть когда вызываем UDPServer<AAA> то в специализации шаблонные параметры после разворачивания обязательно должны совпадать с базовой декларацией, где по дефолту войды, так?

Ramil Rizvanov
то есть когда вызываем UDPServer<AAA> то в специал...

Совпадать не обязаны. Просто когда ты пишешь UDPServer<AAA>, ты фактически получаешь UDPServer<AAA, void, void>, где void достаются из дефолта. Дальше компилятор пытается сматчить специализацию, но не может, т.к. у неё не void'ы, а int и float.

Ramil-Rizvanov Автор вопроса

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
А какие чаты вообще в ходу? Auto aim? И что еше
do you think you're better off alone? А
13
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Какой дос блять?
007
9
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Коллеги, а в чём сейчас хорошо писать на перле, в смысле ide? Пробовал в идее с плагином, подсветка есть, даже какие-то предупреждения есть, но рефакторинга считай нет. Перене...
Дмитрий Петров
9
Карта сайта