可以从指向成员函数模板参数的指针推导出 class 类型吗

Can class type be deduced from pointer to member function template parameter

是否可以从 class T 指向成员 T::*f 的指针推断出其类型,如下所示。

struct Foo
{
    void func(){}
};

template<typename T, void (T::*f)()>
void bar()
{
}

int main()
{
    bar<Foo,Foo::func>();
    // bar<Foo::func>(); // Desired
}

在 C++11/14 中我会说不,除非你接受通过将指针作为函数参数传递来推导它:

template<typename T>
void bar(void(T::*f)())
{
}

int main()
{
    bar(&Foo::func);
}

在 C++17 中,你可以有一个单一的参数函数模板,如 所示,但无论如何你都没有推导出类型 T(如果这是目的,如它似乎来自问题)。

在 C++17 中,您将被允许编写

template<auto M>
void bar();

允许

bar<&Foo::func>();

如果您可以访问 C++17,则可以使用 auto 模板参数和 decltype 来检查 class 类型:

struct Foo { void func(){} };

template<typename R, typename C, typename... Args>
C function_pointer_class(R (C::*)(Args...));

template<auto f>
std::enable_if_t<std::is_member_function_pointer_v<decltype(f)>>
bar() {
    using class_t = decltype(function_pointer_class(f));

    // stuff...
}

int main() {
    bar<&Foo::func>();
}