所以,假设我想使用类型擦除键入erase.
我可以为支持自然的变体创建伪方法:
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
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何将其扩展为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?
};
Run Code Online (Sandbox Code Playgroud)
可以某种方式自动重新绑定一些代码,以便上述类型的语法可以工作.
理想情况下,它与使用变体的情况一样简洁.
template<class...Ops, class Op,
// SFINAE filter that an op matches:
std::enable_if_t< std::disjunction< std::is_same<Ops, …Run Code Online (Sandbox Code Playgroud)