是否可以从其指向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
}
答案 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>();
}