параметризован нетиповым аргументом - указателем на функцию-член. Для этого в шаблоне нужно явно указывать, какую сигнатуру имеет метод:
<Ret (Class::*fn_ptr)(Arg1, Arg2, …)>. Можно ли как-то принимать указатель на метод произвольного класса или произвольной сигнатуры (чтобы уже потом вытаскивать из него конкретный класснейм и типы аргументов и возврата)?
Сделать тип функции параметром шаблона.
а может как-то проще можно? что за задача?
template < MemFnPtr auto >?
а так можно? Если да, то это вроде фича 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;
За пример спасибо огромное! Но на самом деле мне надо как-то выжить в условиях C++17… =)
static_assert(), возможно (вместо концепта)? Edit: С учетом примера выше. template < auto p > constexpr bool isMemFnPtr{Impl::IsMemFnPtr<decltype(p)>::value}; template < auto p > struct S { static_assert(isMemFnPtr<p>); };
ненене, тут же вопрос не в ограничении типа, а в том, как вообще принимать указатель на произвольную функцию-член (да пусть хоть на void*, если б так было можно) заассертить и за enable_if’ать всегда успеем
тип или значение?
Так NTTP же (те, что через placeholder).
Да, только надо еще учитывать const и noexcept
Обсуждают сегодня