Тип вывода для класса std :: function, созданный из указателя на функцию-член - PullRequest
0 голосов
/ 10 апреля 2020

Существует множество примеров определения типа класса 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, которая делает возможным игру, я играю

...