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