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

时间:2017-03-16 16:56:04

标签: c++ templates pointer-to-member type-deduction template-deduction

是否可以从其指向memmber 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
}

3 个答案:

答案 0 :(得分:5)

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

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

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

在C ++ 17中,您可以使用@Jarod42所示的单个参数函数模板,但无论如何都没有推导出T类型(如果它的目的是为了来自问题)。

答案 1 :(得分:2)

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

template<auto M>
void bar();

允许

bar<&Foo::func>();

答案 2 :(得分:2)

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

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>();
}