推导指向成员函数模板参数的指针的参数类型

Deduce parameter type of pointer to member function template parameter

我正在尝试用一个 void (Foo::*FUNC)(T const *) 类型的模板参数编写一个 C++ 函数模板 f,其中 Foo 是某种 class 类型。此外,我想从为 FUNC 指定的具体成员函数指针中推导出 T。所以一个想法是:

template<typename T, void(Foo::*FUNC)(T const *)>
void f()
{ /* use T in here, e.g. if constexpr (std::is_same_v<T, int>) */ }

但是我必须在实例化 f 时明确指定 T 并且不能只写例如f<&Foo::bar>。我知道有一些方法可以推断函数第一个参数的类型,但它们都过于复杂(不使用 Boost)。有没有更聪明的方法来做我想做的事?

这是一个从成员函数指针中提取参数的特征,看起来像您期望的那样:

namespace detail {
    template<typename M> struct extract_arg;
    template<typename R, class C, typename A>
    struct extract_arg<R (C::*)(A const*)> { using type = A; }
}

这里是一个 C++17 函数模板,它有一个非类型模板参数,其类型是从占位符推导出来的:

template<auto FUNC>
void f()
{
    static_assert(std::is_member_function_pointer_v<decltype(FUNC)>);
    using T = typename detail::extract_arg<decltype(FUNC)>::type;
    T t{};
}

它使用 std::is_member_function_pointer 来检查它确实是正确的类型(好吧,类型族),然后我们的辅助特征提取 T.

See it live.