如果模板中存在,如何获取成员函数指针
How to get member function pointer if exists in a template
要获得一个class成员函数指针,我们执行以下操作:
return_type (Class::*varName)(paramType1, paramTypeN) = &Class::functionName;
"functionName"应该提前知道了
事实是,我不(我们实际上不应该)关心函数名,有没有办法,我可以检查 "member function pointer" 是否存在,如果它不为空,我调用它。
我想在我的模板中这样做 class。
如果模板参数对象有一个成员函数,它与我期望的签名匹配,我就调用那个函数。
该代码不是有效的 C++ 代码,但它为您提供了我正在寻找的内容的提示。
template< typename T >
class MyTemplateClass {
void myFunction(T& object) {
if constexpr( exists_in_class< T, void (T::*)(const int&, const int&) >::value ) {
call_member_function_pointer<
T,
void (T::*)(const int&, const int&) >( object, 1, 2 );
}
}
};
如果那不可能,因为您可能有许多名称不同但签名(原型)完全相同的函数。
是否可以找到一种方法来传递函数名,如下所示:
template< typename T >
class MyTemplateClass {
void myFunction(T& object) {
if constexpr( exists_in_class< T, void (T::*)(const int&, const int&), FunctionNameIExpect >::value ) {
call_member_function_pointer<
T,
void (T::*)(const int&, const int&),
FunctionNameIExpect >( object, 1, 2 );
}
}
};
使用 std::experimental::is_detected,你可以这样做:
template<class T>
using has_my_function_name_t = decltype(&T::my_function_name);
template< typename T >
class MyTemplateClass
{
public:
void myFunction(T& object)
{
if constexpr(std::experimental::is_detected_exact<void (T::*)(const int&, const int&),
has_my_function_name_t, T>::value) {
object.my_function_name(1, 2);
}
}
};
如果您对允许的签名(Ret (T::*)(int, int) /*const*/
)更宽容,可能会使用std::is_invocable
。
要获得一个class成员函数指针,我们执行以下操作:
return_type (Class::*varName)(paramType1, paramTypeN) = &Class::functionName;
"functionName"应该提前知道了
事实是,我不(我们实际上不应该)关心函数名,有没有办法,我可以检查 "member function pointer" 是否存在,如果它不为空,我调用它。
我想在我的模板中这样做 class。
如果模板参数对象有一个成员函数,它与我期望的签名匹配,我就调用那个函数。
该代码不是有效的 C++ 代码,但它为您提供了我正在寻找的内容的提示。
template< typename T >
class MyTemplateClass {
void myFunction(T& object) {
if constexpr( exists_in_class< T, void (T::*)(const int&, const int&) >::value ) {
call_member_function_pointer<
T,
void (T::*)(const int&, const int&) >( object, 1, 2 );
}
}
};
如果那不可能,因为您可能有许多名称不同但签名(原型)完全相同的函数。 是否可以找到一种方法来传递函数名,如下所示:
template< typename T >
class MyTemplateClass {
void myFunction(T& object) {
if constexpr( exists_in_class< T, void (T::*)(const int&, const int&), FunctionNameIExpect >::value ) {
call_member_function_pointer<
T,
void (T::*)(const int&, const int&),
FunctionNameIExpect >( object, 1, 2 );
}
}
};
使用 std::experimental::is_detected,你可以这样做:
template<class T>
using has_my_function_name_t = decltype(&T::my_function_name);
template< typename T >
class MyTemplateClass
{
public:
void myFunction(T& object)
{
if constexpr(std::experimental::is_detected_exact<void (T::*)(const int&, const int&),
has_my_function_name_t, T>::value) {
object.my_function_name(1, 2);
}
}
};
如果您对允许的签名(Ret (T::*)(int, int) /*const*/
)更宽容,可能会使用std::is_invocable
。