模板中是否存在成员函数指针

时间:2019-11-07 08:47:58

标签: c++ metaprogramming member-function-pointers

要获取类成员函数指针,请执行以下操作:

return_type (Class::*varName)(paramType1, paramTypeN) = &Class::functionName; 

“ functionName”应事先知道。

事实是,我不(实际上不应该)关心函数名称,有没有一种方法可以检查“成员函数指针”的存在,如果它不为null,我称之为。

我想在模板类中做到这一点。

如果模板参数对象具有成员函数,该成员函数与我期望的签名相匹配,则我将该函数称为

该代码不是有效的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 );

          }
    }
};

1 个答案:

答案 0 :(得分:0)

使用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);
        }
    }
};

Demo

如果允许使用允许的签名(Ret (T::*)(int, int) /*const*/),则可以使用std::is_invocable