1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| template <class C, typename T, typename... Args>
std::list<std::pair<action_cb, rollback_cb>> pb_trans_impl_impl(C & cont, T const & val, Args &... args) {
auto sub = pb_trans_impl_impl(args...);
sub.push_front({ [&cont, &val] () { cont.push_back(val); },
[&cont] () { cont.pop_back(); }
});
return sub;
}
template <>
std::list<std::pair<action_cb, rollback_cb>> pb_trans_impl_impl() {
return {};
}
template <typename... Args>
std::vector<std::pair<action_cb, rollback_cb>> pb_trans_impl(Args &... args) {
auto list = pb_trans_impl_impl(args...);
return std::vector<std::pair<action_cb, rollback_cb>>(list.begin(), list.end());
}
template <typename... Args>
void pb_trans(Args &... args) {
transaction(pb_trans_impl(args...));
}
// ...
int main() {
std::vector<int> vi;
std::vector<double> vd;
std::vector<float> vf;
pb_trans(vi, 42, vd, 3.14, vf, 1.f);
} |
Partager