Существует множество примеров определения типа класса MFP (указатель на функцию-член) (, например, ). Но, скажем, у меня есть:
struct MyStruct {
int doSomething(int);
}
int doSomethingElse(MyStruct&,int);
std::function<int(MyStruct&,int)> func1 = &MyStruct::doSomething;
std::function<int(MyStruct&,int)> func2 = &doSomethingElse;
Я хотел бы сделать несколько SFINAE в зависимости от того, была ли функция создана с помощью МФУ, а затем использовать тип класса с этой функцией-членом (если она была). Однако func1 и func2, похоже, имеют одинаковый тип.
Я забочусь только о несвязанных функциях, поэтому что-то вроде std::function<int(int)> func3 = std::bind(&MyStruct::doSomething, MyStruct(), _1);
не важно, так как оно уже связано с объектом (и кажется, что его невозможно различить в любом случае). Я надеялся, что у std :: function target / target_type есть что-то для меня, но, похоже, нет.
В настоящее время единственное решение, которое я могу придумать, - это заставить пользователя использовать одну из двух реализаций, где предполагается, что Функция была создана с помощью MFP и использует первый тип параметра в качестве класса, но я хотел бы предоставить только одну функцию, которая автоматически выводит эту информацию.
В идеале я мог бы сделать что-то вроде:
template<class T>
struct A;
template<class Ret, class C, class... Args>
struct A<std::function<Ret(C::*)(Args...)>> {
// use C
}
У меня нет ограничений на версию, поэтому, если есть какая-то новая функция c ++ 20, которая делает возможным игру, я играю