Чтобы не быть голословным, вот на плюсах ADT + pattern matching:
typedef boost::variant<boost::blank, int, string, vector<int>> var_t;
vector<int> vit;
var_t myFooV = vit;
auto visitor = make_lambda_visitor<void>(
[](int v) -> void { cout << "int: " << v << endl; },
[](string& v) -> void{ cout << "string: " << v << endl; },
[](vector<int>& v) -> void{
v.push_back(27);
boost::get<vector<int>>(myFooV).push_back(34);
cout << " vector.. has elements: " << v.size() << endl;
}
);
boost::apply_visitor( visitor , myFooV );
Не сказал бы что мне вот прям идеально нравится эта реализация, по моему мнению можно сделать ещё краше. Но тем не менее :-)