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

Всем привет! У меня тут извращенский вопрос по шаблонам. Допустим какой-то шаблон

параметризован нетиповым аргументом - указателем на функцию-член. Для этого в шаблоне нужно явно указывать, какую сигнатуру имеет метод:
<Ret (Class::*fn_ptr)(Arg1, Arg2, …)>. Можно ли как-то принимать указатель на метод произвольного класса или произвольной сигнатуры (чтобы уже потом вытаскивать из него конкретный класснейм и типы аргументов и возврата)?

12 ответов

21 просмотр

Сделать тип функции параметром шаблона.

а может как-то проще можно? что за задача?

template < MemFnPtr auto >?

Anton-Semenov Автор вопроса
Sergey Anisimov
template < MemFnPtr auto >?

а так можно? Если да, то это вроде фича 23 или 20го стандарта, но лично я с ней ни разу не встречался. не напомнишь, где посмотреть подробности, плиз?

Anton Semenov
а так можно? Если да, то это вроде фича 23 или 20г...

Двадцатого, да, поскольку требуются концепты (можно и констреинтом, разумеется). Статью что-то затрудняюсь привести, впрочем. Сейчас поищу. Edit: В качестве базового примера пока что. #include <type_traits> namespace Impl { template < typename > struct IsMemFnPtr: std::false_type { }; template < typename Ret, typename Class, typename... Params > struct IsMemFnPtr<Ret(Class::*)(Params...)>: std::true_type { }; } template < typename T > concept MemFnPtr = Impl::IsMemFnPtr<T>::value; /* ... */ template < MemFnPtr auto > struct S;

Anton-Semenov Автор вопроса
Sergey Anisimov
Двадцатого, да, поскольку требуются концепты (можн...

За пример спасибо огромное! Но на самом деле мне надо как-то выжить в условиях C++17… =)

Anton Semenov
За пример спасибо огромное! Но на самом деле мне ...

static_assert(), возможно (вместо концепта)? Edit: С учетом примера выше. template < auto p > constexpr bool isMemFnPtr{Impl::IsMemFnPtr<decltype(p)>::value}; template < auto p > struct S { static_assert(isMemFnPtr<p>); };

Anton-Semenov Автор вопроса
Sergey Anisimov
static_assert(), возможно (вместо концепта)? Edit:...

ненене, тут же вопрос не в ограничении типа, а в том, как вообще принимать указатель на произвольную функцию-член (да пусть хоть на void*, если б так было можно) заассертить и за enable_if’ать всегда успеем

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

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

а через 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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта