如何在编译时从string_view中删除子字符串?

问题描述 投票:0回答:1

我创建了一个名为DBG的宏,该宏本身会打印一个表达式及其计算所得的值。因此,DBG(5+1)应该打印5+1 = 6。该宏工作正常。

但是,如果我封装了一个以上的宏,那将变得非常不可读,因为“ DBG”本身总是被拖拉。

我想做的是在编译时从表达式本身中删除所有出现的子字符串“ DBG”。这样DBG(DBG(5*3) + DBG(20/4))结果将not

5*3 = 15
20/4 = 5
DBG(5*3)+DBG(20/4) = 20

但代替

5*3 = 15
20/4 = 5
(5*3)+(20/4) = 20

如果需要:宏看起来像这样:#define DBG(expression) debug_log((#expression, expression),debug_log为:

template<typename T>
inline constexpr T debug_log(const std::string_view& raw_expression, T&& x)
{
    using namespace std;
    cout << raw_expression << " = " << x << endl;
    return x;
}

我已经写了一个应该执行此操作的辅助函数,但是我不知道如何在编译时将两个string_views连接起来。


inline constexpr auto clean_expression(const std::string_view& expression)
{
    constexpr std::string_view macro_name = "DBG";
    constexpr auto marco_name_length = macro_name.size();

    auto pos = expression.find(macro_name);

    if (pos == -1) {
        return expression;
    }
    else {
        auto after_macro_name = expression.substr(pos + marco_name_length);

        auto length_before_macro = expression.size() - after_macro_name.size() - marco_name_length;
        std::string_view string_before_macro_name = expression.substr(0, length_before_macro);

        // TODO: Finish implementation by concatenating the string_before_macro_name and after_macro_name and cleaning the result
        //auto partly_cleaned_string = concatenate(string_before_macro_name, after_macro_name)}; <-- that one is missing
        //return clean_expression(partly_cleaned_string);
    }
}
c++ substring string-concatenation constexpr string-view
1个回答
0
投票

您当前的策略将不起作用,因为std::string_view必须指向一些现有的连续数据块。因此,除非您返回string_view的单个切片,否则必须分配一个char数组并将其返回到struct中:

© www.soinside.com 2019 - 2024. All rights reserved.