3
我有兩個元組,一個包含值和另一個包含這些值的動作的元組。 現在我想對每個值應用相應的操作,儘可能少的代碼「開銷」。 就像下面的簡單例子。如何在數組元組上應用一個動作元組?
#include <iostream>
#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;
struct ThinkPositive
{
void operator()(int &val) const
{
std::cout << "Think positive!\n";
val = std::abs(val);
}
};
struct Nice
{
void operator()(int &val) const
{
std::cout << val << " is nice!\n";
}
};
void numbers()
{
auto handlers = hana::make_tuple(Nice{}, ThinkPositive{});
auto nums = hana::make_tuple(5, -12);
auto handlers_and_nums = hana::zip(handlers, nums);
hana::for_each(handlers_and_nums, [](auto &handler_num) {
handler_num[0_c](handler_num[1_c]);
});
auto result = hana::transform(handlers_and_nums, [](const auto &handler_num) {
return handler_num[1_c];
});
hana::for_each(result, [](const auto num) {
std::cout << "got " << num << '\n';
});
}
int main()
{
numbers();
}
雖然上面的例子工作,它會更好地修改nums內容的地方。
有沒有辦法在適當位置修改數字?
當你說「到位」,你的意思是「在'handlers_and_nums'」,或者你的意思是「在'nums'」?如果是後者,你可以創建一個'handlers_and_pointers_to_nums'而不是間接通過指針? (請記住:「計算機科學中的任何問題都可以通過另一個間接層面來解決(除了太多的間接層面)」) –