我有一个二维数组。按正向迭代行是完全可以的,但是当我反向执行时,它不起作用。我不明白为什么。
我正在使用 MSVC v143 和 C++20 标准。
int arr[3][4];
for (int counter = 0, i = 0; i != 3; ++i) {
for (int j = 0; j != 4; ++j) {
arr[i][j] = counter++;
}
}
std::for_each(std::begin(arr), std::end(arr), [](auto const& row) {
for (auto const& i: row) {
fmt::print("{} ", i);
}
fmt::print("\n");
});
std::for_each(std::rbegin(arr), std::rend(arr), [](auto const& row) {
for (auto const& i: row) {
fmt::print("{} ", i);
}
fmt::print("\n");
});
Run Code Online (Sandbox Code Playgroud)
第一个的输出for_each很好:
0 1 2 3 …Run Code Online (Sandbox Code Playgroud) 几乎每个 OOP 程序员都接触过控制反转的概念。在 C++ 中,我们可以通过动态回调(即 lambda 和函数指针等函子)来实现该原理。但是,如果我们在编译时知道要向驱动程序注入什么过程,理论上我相信有一种方法可以通过组合回调和驱动程序/信号/诸如此类的函数来消除函数传递和调用的开销进入“展开的程序”。这是一个例子。
对于 GUI 程序,我们有关于窗口 1) 设置、2) 循环和 3) 终止的逻辑。我们可以在 1) 窗口设置之后、2) 在每个渲染循环中、3) 和终止之前注入代码。程序方法是这样写:
// Snippet 1:
init_window();
init_input_handler();
init_canvas();
init_socket();
while (!window_should_close()) {
update_window();
handle_input();
draw_on_canvas();
send_through_socket();
}
drop_input_handler();
drop_canvas();
drop_socket();
terminate_window();
Run Code Online (Sandbox Code Playgroud)
OOP 程序员以解耦和适当的抽象为荣。相反,我们这样写:
// Snippet 2:
init_window();
on_window_init_signal.send();
while (!window_should_close()) {
update_window();
on_render_signal.send();
}
on_exit_signal.send();
terminate_window();
Run Code Online (Sandbox Code Playgroud)
但这会带来如上所述的不必要的开销。我的问题是:我们如何利用C++元编程机制来实现零开销控制反转,以便与代码片段2类似形式的代码可以静态地(即在编译时)转换为代码片段1 ?
编辑:我可以想到优化器中广泛存在的循环优化。也许这是该问题的通用版本。