可以从指向成员函数模板参数的指针推导出 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>();
}
是否可以从 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>();
}