#include <tuple>
#include <iostream>
#include <string>
#include <map>
#include <functional>
std::map<char, std::function<int(int, int)> > ops =
{
{'+', [](int f, int s) { return f + s; } }
};
int calc(int value)
{
return value;
}
template<typename Left, typename Right>
int calc(const std::tuple<char, Left, Right>& tuple)
{
char symbol = std::get<0>(tuple);
Left l_child = std::get<1>(tuple);
Right r_child = std::get<2>(tuple);
int l = calc(l_child);
int r = calc(r_child);
return ops[symbol](l, r);
}
int main()
{
auto left(std::make_tuple('+', 1, 2));
auto right(std::make_tuple('+', 5, 6));
auto expr(std::make_tuple('+', left, right));
std::cout << calc(expr) << std::endl;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKc3RkOjptYXA8Y2hhciwgc3RkOjpmdW5jdGlvbjxpbnQoaW50LCBpbnQpPiA+IG9wcyA9CnsKICAgeycrJywgW10oaW50IGYsIGludCBzKSB7IHJldHVybiBmICsgczsgfSB9Cn07CgppbnQgY2FsYyhpbnQgdmFsdWUpCnsKICAgcmV0dXJuIHZhbHVlOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBMZWZ0LCB0eXBlbmFtZSBSaWdodD4KaW50IGNhbGMoY29uc3Qgc3RkOjp0dXBsZTxjaGFyLCBMZWZ0LCBSaWdodD4mIHR1cGxlKQp7CiAgIGNoYXIgc3ltYm9sID0gc3RkOjpnZXQ8MD4odHVwbGUpOwogICBMZWZ0IGxfY2hpbGQgPSBzdGQ6OmdldDwxPih0dXBsZSk7CiAgIFJpZ2h0IHJfY2hpbGQgPSBzdGQ6OmdldDwyPih0dXBsZSk7CiAgIGludCBsID0gY2FsYyhsX2NoaWxkKTsKICAgaW50IHIgPSBjYWxjKHJfY2hpbGQpOwogICByZXR1cm4gb3BzW3N5bWJvbF0obCwgcik7Cn0KCmludCBtYWluKCkKewogICBhdXRvIGxlZnQoc3RkOjptYWtlX3R1cGxlKCcrJywgMSwgMikpOwogICBhdXRvIHJpZ2h0KHN0ZDo6bWFrZV90dXBsZSgnKycsIDUsIDYpKTsKICAgYXV0byBleHByKHN0ZDo6bWFrZV90dXBsZSgnKycsIGxlZnQsIHJpZ2h0KSk7CiAgIHN0ZDo6Y291dCA8PCBjYWxjKGV4cHIpIDw8IHN0ZDo6ZW5kbDsKfQ==