信用泰安网站2023必考十大时政热点
C++17 引入了结构化绑定用来声明变量, 到现在为止它能出现在if/while/for
等语句中.
P0963提议了新的语法增强, 允许结构化绑定作为条件使用, 这将简化代码写法.
通常在if
中声明变量时, 我们会进一步对变量做判断, 比如:
#include <charconv>
#include <print>struct parse_result {long result;const char* begin;const char* end;
};parse_result parse(const char* begin, const char* end) {char* last;auto ret = strtoll(begin, &last, 10);return {ret, last, end};
}int main() {std::string_view str = "123 456 789";auto begin = str.data();auto end = str.data() + str.size();
//{if (auto [ret, first, last] = parse(begin, end);first != last) {// interpret [first, last) into a valuestd::println("ok, got {}", ret);}
//}
}
first != last
是分支判断条件, 它具有重复性. 我们可以重载操作符()
, 返回布尔值, 从而在if
中调用.
struct parse_result {long result;const char* begin;const char* end;explicit operator bool() const noexcept {std::println("operator () called");return begin != end;}
};
之前的代码就可以简化为:
#include <charconv>
#include <print>struct parse_result {long result;const char* begin;const char* end;explicit operator bool() const noexcept {std::println("operator () called");return begin != end;}
};parse_result parse(const char* begin, const char* end) {char* last;auto ret = strtoll(begin, &last, 10);return {ret, last, end};
}int main() {std::string_view str = "123 456 789";auto begin = str.data();auto end = str.data() + str.size();
//{if (auto [ret, first, last] = parse(begin, end)) {// interpret [first, last) into a valuestd::println("ok, got {}", ret);}
//}return 0;
}
对于标准库中已经实现类似功能的接口(std::from_chars/std::to_chars
), 我们就可以利用它来简化代码:
#include <charconv>
#include <iostream>int main() {char buffer[16];char* p = buffer;char* last = buffer + sizeof(buffer);// before C++26if (auto result = std::to_chars(p, last, 42)) {auto [ptr, _] = result;// okay to proceed} else {auto [ptr, ec] = result;// handle errors}// C++26if (auto [ptr, ec] = std::to_chars(p, last, 42)) {// okay to proceed} else {// handle errors}return 0;
}
进一步阅读
- C++26 新特性预览(Preview)
- 契约(Contract)
- C++26 编译时反射简介
- C++26 占位符变量改进