簡體   English   中英

如果模板中存在,如何獲取成員 function 指針

[英]How to get member function pointer if exists in a template

要獲取 class 成員 function 指針,我們執行以下操作:

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

“functionName”應該是事先知道的。

事實是,我不(我們實際上不應該)關心 function 名稱,有沒有辦法可以檢查“成員 function 指針”是否存在,如果它不是 Z37A6259CC0C1DAE299A7806 的話。

我想在我的模板 class 中這樣做。

如果模板參數 object 有一個成員 function,它與我期望的簽名匹配,我稱之為 function。

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

          }
    }
};

如果這是不可能的,因為您可能有許多具有不同名稱但具有相同確切簽名(原型)的函數。 是否可以找到一種方法來傳遞 function 名稱如下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM