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

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

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

12 ответов

9 просмотров

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

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

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’ать всегда успеем

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

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

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
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
Hello, can I install macOS and run flutter on a virtual machine? Is it possible to print for iphone?
Mazones
11
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
Дороу! У кого-нибудь есть в загашнике проверенная функция экранирования, аналог re.escape в Python? Из доки: » Escape all the characters in pattern except ASCII letters and n...
Daniil Smolyakov
9
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Карта сайта