我创建了一个名为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);
}
}
您当前的策略将不起作用,因为std::string_view
必须指向一些现有的连续数据块。因此,除非您返回string_view
的单个切片,否则必须分配一个char数组并将其返回到struct中: