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

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

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

43 ответов

21 просмотр

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

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 Автор вопроса

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта