C++26新特性解读: 结构化绑定作为条件
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 value
std::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 value
std::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++26
if (auto result = std::to_chars(p, last, 42)) {
auto [ptr, _] = result;
// okay to proceed
} else {
auto [ptr, ec] = result;
// handle errors
}
// C++26
if (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 占位符变量改进