dvv*_*vrd 6 c++ qt static-assert qobject c++11
如果给出类型I的声明不包含Q_OBJECT
宏,我有一些有趣的需要显示编译错误.我找到了一种不好的方法.实际上它重复了Qt开发人员做同样伎俩的想法:
template<typename T>
void checkForQObjectMacro()
{
reinterpret_cast<T *>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T *>(0));
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但它确实给出了奇怪的错误信息.我想展示一条可读的消息.一种方法是使用static_assert
构造.但我不知道如何实现Q_OBJECT
宏存在的静态验证条件.也许有人可以提出一个漂亮的黑客?也非常感谢任何想法.
这就是Qt 的做法:
Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
"No Q_OBJECT in the class with the signal");
Run Code Online (Sandbox Code Playgroud)
请注意,它使用的是私有 API,但从这里开始:
namespace QtPrivate {
/* Trait that tells is a the Object has a Q_OBJECT macro */
template <typename Object> struct HasQ_OBJECT_Macro {
template <typename T>
static char test(int (T::*)(QMetaObject::Call, int, void **));
static int test(int (Object::*)(QMetaObject::Call, int, void **));
enum { Value = sizeof(test(&Object::qt_metacall)) == sizeof(int) };
};
}
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到 5.2 中 Gerrit 的变化:
https://codereview.qt-project.org/#change,65508
归档时间: |
|
查看次数: |
1065 次 |
最近记录: |