[英]Overload [] subscript operator for std::any
有没有办法为 std::any 重载operator[]
?
我有一个看起来像这样的结构:
struct Container {
public:
template <typename T>
void push_back(const T &t) {
m_container.push_back(t);
}
private:
std::vector<std::any> m_container;
}
现在我希望能够通过索引(可以是任何类型)访问元素。
我想像这样的访客
struct subscript_visitor {
std::string operator[](const size_t &idx) {
}
int operator[](const size_t &idx) {
}
...
}
但是不能声明具有相同返回类型的函数。
任何想法如何解决这个问题,这样的东西
Container c;
c.push_back(0);
std::cout << c[0];
将工作?
如果您想稍后访问该类型,则需要存储其他信息。 您可以通过将 function 指针存储到用于打印的模板 function 的特化来实现。 您需要为每个要访问的 function 的向量元素添加一个数据成员,以使其工作。 std::variant
在这种情况下可能更可取,具体取决于用例。
struct Container {
public:
template <typename T>
void push_back(T&& t) {
m_container.emplace_back(std::forward<T>(t));
}
struct Element
{
template<class U>
Element(U&& value)
: m_value(std::forward<U>(value)),
m_printFunction(&Container::Print<U>)
{
}
std::any m_value;
void (*m_printFunction)(std::ostream&, std::any const&);
};
Element const& operator[](size_t index) const
{
return m_container[index];
}
private:
template<class U>
static void Print(std::ostream& s, std::any const& value)
{
s << any_cast<U>(value);
}
std::vector<Element> m_container;
};
std::ostream& operator<<(std::ostream& s, Container::Element const& value)
{
value.m_printFunction(s, value.m_value);
return s;
}
int main()
{
Container c;
c.push_back(0);
c.push_back(std::string("Hello World"));
std::cout
<< c[0] << '\n'
<< c[1] << '\n';
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.