如何将递归QMetaObject::newInstance(..)从QObject*转换为QGenericArgumen
How to convert from QObject* to QGenericArgument for recursive QMetaObject::newInstance(...)
我在使用Qt元对象系统开发DI IoC。
class Resolver
{
public:
template <typename BaseType, typename DerivedType>
void Bind() { ... }
template <typename T>
T* Resolve() { ... }
...
private:
QObject* ResolveByName(QString typeName) { ... }
QHash<QString, QMetaObject> _container;
...
}
Bind方法存储_container
的类型信息,Resolve
方法使用这些信息创建实例。我使用QMetaObject::newInstance(QGenericArgumet arg1, QGenericArgumet arg2, ...)
和递归构造函数参数解决。例如我们有这样的类:
class IUserService { ... }
class NativeUserService : public IUserService
{
NativeUserService(IUserRepository* userRepository) { ... }
}
客户端调用后:
IUserService* userService = resolver.Resolve<IUserService>();
Resolver calls ResolveByName("IUserService*"):
QObject* ResolveByName(Qstring typeName)
{
QMetaObject meta = _container.value(typeName);
...
for (quint8 index = 0; index < 10; index++)
{
...
QString argType = constructorType.parameterTypes().at(index);
QObject *argValue = ResolveByName(argType);
ctorArgs << QGenericArgument(???);
}
...
return meta.newInstance(ctorArgs[0], ctorArgs[1], ...);
}
问题:如何将meta.newInstance()
结果传递给meta.newInstance()
参数(从QObject*
转换为QGenericArgument
)?
不应该直接使用QGenericArgument。有Q_ARG
。
Q_ARG(QObject*, object)
我解决我的问题。关键是使用static_cast<const void *>(&argValue)
。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *',这是指针,对象是 QGraphicsObject 的子类
- QObject基类到继承对象的C++类型转换
- 将nativeObject转换为QObject qt5 c++
- QtQMetaObjects和从QWidget到QObject的转换
- 如何将递归QMetaObject::newInstance(..)从QObject*转换为QGenericArgumen
- 防止将 QObject* 隐式转换为布尔值:防止'Multiple constructor'警告
- Qt,无法将不完整类型'A *'的参数转换为'const QObject *'
- 如何将 QList<QObject *> 转换为 QList<ADerivedQObjectClass*>
- QObject*和void*之间的转换
- C2665:'QObject::connect':3 个重载都无法转换所有参数类型
- 将const QObject*转换为QObject*