繁体   English   中英

重载 std::any 的 [] 下标运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM