Pourquoi ne pas utiliser un variant ?


typedef boost::make_recursive_variant<
std::string,
std::vector< boost::recursive_variant_ >
>::type string_tree_t;