Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何声明带成员函数指针的函数_C++_Qt_Function Pointers - Fatal编程技术网

C++ 如何声明带成员函数指针的函数

C++ 如何声明带成员函数指针的函数,c++,qt,function-pointers,C++,Qt,Function Pointers,我有一个类,其成员变量指向库对象 class myClassA { private: libraryClass *libraryObject; } 库类发出以字符串为特征的事件,并提供一种机制,允许客户端类指定在发出事件时应调用的成员函数,因此在myClassA中,我可以这样做 libraryObject->connect ("eventName", this, &myClassA::privateMember); 我现在希望myClassA的客户端能够通过向myCla

我有一个类,其成员变量指向库对象

class myClassA {
private:
    libraryClass *libraryObject;
}
库类发出以字符串为特征的事件,并提供一种机制,允许客户端类指定在发出事件时应调用的成员函数,因此在myClassA中,我可以这样做

libraryObject->connect ("eventName", this, &myClassA::privateMember);
我现在希望myClassA的客户端能够通过向myClassA添加一个公共成员函数connect将其成员函数连接到事件。我应该如何在myClassA头文件中声明connect

具体地说,我正在使用Qt并尝试允许(myClassA的)客户端调用QScxmlStateMachine::connectToEvent。for this函数将其描述为

QMetaObject::Connection QScxmlStateMachine::connectToEvent(
            const QString &scxmlEventSpec,
            const QObject *receiver,
            PointerToMemberFunction method,
            Qt::ConnectionType type = Qt::AutoConnection)
但我不清楚PointerToMemberFunction应该如何定义

Qt头文件将其声明为

template <typename Func1>
QMetaObject::Connection connectToEvent(
        const QString &scxmlEventSpec,
        const typename QtPrivate::FunctionPointer<Func1>::Object *receiver, Func1 slot,
        Qt::ConnectionType type = Qt::AutoConnection);
模板
QMetaObject::连接connectToEvent(
常量QString和scxmlEventSpec,
常量类型名QtPrivate::FunctionPointer::Object*接收器,Func1插槽,
Qt::ConnectionType类型=Qt::自动连接);
与其我只是盲目地将其复制到我的代码中,看看它是否有效,不如有人向我解释一下这个声明;特别是,我读到它是说有些东西是模板化的,我不明白是什么,为什么我不需要做任何模板-y来使用这个机制


谢谢。

QtPrivate::FunctionPointer
是一个类型特征模板,有助于新的Qt信号/插槽语法

类型特征:
QtPrivate::FunctionPointer
trait基本上是一个helper类,它提供关于给定对象的元数据 类型。Qt中的另一个特征示例是
QTypeInfo

为了实现新语法,我们需要知道的是 有关函数指针的信息

模板结构函数指针将为我们提供
通过其成员提供有关
T
的信息

  • ArgumentCount
    :表示函数参数数量的整数

  • 对象
    :仅针对指向成员函数的指针存在。它是函数所属类的typedef

  • 参数
    :表示参数列表。它是元编程列表的类型定义

  • 调用(T&function,QObject*receiver,void**args)
    :应用给定参数调用函数的静态函数

FunctionPointer
的实现在于

此特性允许根据提供的参数选择右侧-
QObject
slot、functor或函数指针(有上下文或无上下文)

//将状态连接到QObject插槽
模板
内联QMetaObject::连接connectToEvent(
常量QString和scxmlEventSpec,
常量类型名QtPrivate::FunctionPointer::Object*接收器,Func1插槽,
Qt::ConnectionType类型=Qt::自动连接)
//将状态连接到函子或函数指针(无上下文)
模板
内联类型名QtPrivate::QEnableIf<
!QtPrivate::FunctionPointer::IsPointerToMemberFunction&&
!std::is_same::value,QMetaObject::Connection>::类型
connectToEvent(常量QString和scxmlEventSpec,Func1插槽,
Qt::ConnectionType类型=Qt::自动连接)
//连接到函子或函数指针的事件(带上下文)
模板
内联类型名QtPrivate::QEnableIf<
!QtPrivate::FunctionPointer::IsPointerToMemberFunction&&
!std::is_same::value,QMetaObject::Connection>::类型
connectToEvent(常量QString&scxmlEventSpec,QObject*上下文,Func1插槽,Qt::ConnectionType=Qt::自动连接)

因此,如果您需要允许所有情况,您可以提供具有相同原型的方法并转发参数。

在制定问题时,遵循所有不同的include文件,使我能够解决此问题

我在myClassA的头文件中包含了以下内容

template//从QtScxmlStateMachine.h中提取
QMetaObject::连接connectToEvent(
常量QString和scxmlEventSpec,
常量类型名QtPrivate::FunctionPointer::Object*接收器,Func1插槽,
Qt::ConnectionType类型=Qt::自动连接){
返回libraryObject->connectToEvent(scxmlEventSpec、接收器、插槽、类型);
};
myClassA的客户端现在可以调用myClassA::connectToEvent来调用底层QtScxmlStateMachine的connectToEvent成员


谢谢你,StackOverflow,你迫使我正确地整理我的思想。

像所有使用谓词一样使用模板?还是一个?这两种方法中的任何一种都会让你的生活更轻松。:)如果需要调用QScxmlStateMachine::connectToEvent函数,那么应该使用相同类型的参数。只需使用PointerToMemberFunction作为类型。connectToEvent希望接收此类型的第三个参数。
// connect state to a QObject slot
template <typename Func1>
inline QMetaObject::Connection connectToEvent(
        const QString &scxmlEventSpec,
        const typename QtPrivate::FunctionPointer<Func1>::Object *receiver, Func1 slot,
        Qt::ConnectionType type = Qt::AutoConnection)


// connect state to a functor or function pointer (without context)
template <typename Func1>
inline typename QtPrivate::QEnableIf<
        !QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
        !std::is_same<const char*, Func1>::value, QMetaObject::Connection>::Type
connectToEvent(const QString &scxmlEventSpec, Func1 slot,
               Qt::ConnectionType type = Qt::AutoConnection)

// connectToEvent to a functor or function pointer (with context)
template <typename Func1>
inline typename QtPrivate::QEnableIf<
        !QtPrivate::FunctionPointer<Func1>::IsPointerToMemberFunction &&
        !std::is_same<const char*, Func1>::value, QMetaObject::Connection>::Type
connectToEvent(const QString &scxmlEventSpec, QObject *context, Func1 slot, Qt::ConnectionType type = Qt::AutoConnection)
template <typename Func1>           // Lifted from QtScxmlStateMachine.h
QMetaObject::Connection connectToEvent(
        const QString &scxmlEventSpec,
        const typename QtPrivate::FunctionPointer<Func1>::Object *receiver, Func1 slot,
        Qt::ConnectionType type = Qt::AutoConnection) {
    return libraryObject->connectToEvent(scxmlEventSpec, receiver, slot, type);
};