如果你非常想要这个,你可以围绕 a 创建一个小包装类,它在构造时std::any
捕获并类型擦除“转换为”操作:reference_wrapper
class any_refable
{
public:
std::any ref() const { return converter(any); }
const std::any& get() const& { return any; }
const std::any&& get() const&& { return std::move(any); }
std::any& get() & { return any; }
std::any&& get() && { return std::move(any); }
any_refable() = default;
template <typename T, typename = std::enable_if_t<! std::is_same_v<std::decay_t<T>, any_refable>>>
any_refable(T&& v) : any(std::forward<T>(v)), converter(make_converter<std::decay_t<T>>()) {}
template <typename T, typename = std::enable_if_t<! std::is_same_v<std::decay_t<T>, any_refable>>>
any_refable& operator=(T&& v) { any = std::forward<T>(v); converter = make_converter<std::decay_t<T>>(); return *this; }
private:
using converter_t = std::any (*)(const std::any&);
std::any any;
converter_t converter = nullptr;
template <typename T>
static converter_t make_converter() {
return [](const std::any& any) { return std::any(std::cref(std::any_cast<const T&>(any))); };
}
};
演示