#include <utility>
#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <string>
#include <memory>
#include <type_traits>
#include <functional>
#include <regex>
#include <boost/variant.hpp>
template<class F>
struct pseudo_method {
F f;
pseudo_method( F&& fin ):f(std::move(fin)) {}
template<class Variant>
friend decltype(auto) operator->*( Variant&& var, pseudo_method const& method ) {
return [&](auto&&...args)->decltype(auto) {
return boost::apply_visitor(
[&](auto&& self)->decltype(auto) {
return method.f( decltype(self)(self), decltype(args)(args)... );
},
std::forward<Variant>(var)
);
};
}
};