小编yud*_*jin的帖子

C ++编译时子字符串

我有很大的代码库,该代码库__FILE__广泛用于日志记录。但是,它包括完整路径,不需要(1),(2)可能会违反安全性。

我正在尝试编写编译时子字符串表达式。最终得到了这个解决方案

static constexpr cstr PastLastSlash(cstr str, cstr last_slash)
{
    return *str == '\0' ? last_slash : *str == '/' ? PastLastSlash(str + 1, str + 1) : PastLastSlash(str + 1, last_slash);
}

static constexpr cstr PastLastSlash(cstr str)
{
    return PastLastSlash(str, str);
}

// usage
PastLastSlash(__FILE__);
Run Code Online (Sandbox Code Playgroud)

效果很好,我检查了汇编代码,在编译时对行进行了修整,只有文件名以二进制形式出现。

但是,此表示法太冗长。我想为此使用宏,但失败了。上面链接中的建议示例

#define __SHORT_FILE__ ({constexpr cstr sf__ {past_last_slash(__FILE__)}; sf__;})
Run Code Online (Sandbox Code Playgroud)

不适用于MSVC编译器(我正在使用MSVC 2017)。使用c ++ 17还有其他方法吗?

UPD1:按功能https://godbolt.org/z/tAU4j7修剪的lang

UPD2:看起来可以使用函数在编译时进行修整,但是完整的字符串将以二进制形式出现。

c++ c++14 c++17

4
推荐指数
2
解决办法
325
查看次数

Qt属性中的枚举

我有一个代码,它可以在Qt 5.5上使用,而不能在Qt 5.2上使用。问题是这个枚举

#include <QtCore/QMetaType>
enum Area
{
    Area_A,
    Area_B,
    Area_C
};

Q_DECLARE_METATYPE(Area)
Run Code Online (Sandbox Code Playgroud)

然后,我有一个对象,它公开了这个area属性:

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Area area READ area WRITE setArea NOTIFY areaChanged)
public:    
    explicit MyClass(QObject *parent = 0)
        : QObject(parent), m_area(Area_A){}

    Area area() const { return m_area; }    
    void setArea(Area area) {
        m_area = area;
        emit areaChanged(area);
    }

signals:
    void areaChanged(Area area);    
private:
    Area m_area;
};
Run Code Online (Sandbox Code Playgroud)

和main.cpp:

#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
#include <QtQml/QQmlContext>
#include <QtQml/QtQml> …
Run Code Online (Sandbox Code Playgroud)

c++ qt qmetaobject

0
推荐指数
1
解决办法
3093
查看次数

标签 统计

c++ ×2

c++14 ×1

c++17 ×1

qmetaobject ×1

qt ×1