Тип стирающий, тип стирающий, `любые` вопросы?

Итак, предположим, что я хочу набрать стирание, используя стирание типа.

Я могу создать псевдо-методы для вариантов, которые включают естественный:

pseudo_method print = [](auto&& self, auto&& os){ os << self; };

std::variant<A,B,C> var = // create a variant of type A B or C

(var->*print)(std::cout); // print it out without knowing what it is

Мой вопрос, как я могу расширить это доstd::any?

Это не может быть сделано "в сыром". Но в тот момент, когда мы назначаем / построитьstd::any у нас есть информация о типе, нам нужно.

Таким образом, в теории, дополненнаяany:

template<class...OperationsToTypeErase>
struct super_any {
  std::any data;
  // or some transformation of OperationsToTypeErase?
  std::tuple<OperationsToTypeErase...> operations;
  // ?? what for ctor/assign/etc?
};

может каким-то образом автоматически перепривязать некоторый код так, чтобы синтаксис вышеуказанного типа работал.

В идеале это было бы так же кратко в использовании, как вариант варианта.

template<class...Ops, class Op,
  // SFINAE filter that an op matches:
  std::enable_if_t< std::disjunction< std::is_same<Ops, Op>... >{}, int>* =nullptr
>
decltype(auto) operator->*( super_any<Ops...>& a, any_method<Op> ) {
  return std::get<Op>(a.operations)(a.data);
}

Теперь я могу оставить этотипи все же разумно использовать лямбда-синтаксис для простоты?

В идеале я хочу:

any_method<void(std::ostream&)> print =
  [](auto&& self, auto&& os){ os << self; };

using printable_any = make_super_any<&print>;

printable_any bob = 7; // sets up the printing data attached to the any

int main() {
  (bob->*print)(std::cout); // prints 7
  bob = 3.14159;
  (bob->*print)(std::cout); // prints 3.14159
}

или похожий синтаксис. Это невозможно? Неосуществимым? Легко?

Ответы на вопрос(2)

Ваш ответ на вопрос