gpt4 book ai didi

c++ - 如何循环继承自 boost::any 中包含的 std::vector 的类

转载 作者:行者123 更新时间:2023-11-28 03:13:53 26 4
gpt4 key购买 nike

所以我有一个继承自 std::vector 的基类:

template<typename T>
class Base : public std::vector<T>
{
std::vector<T> vect_;
public:
Base() : std::vector<T>({1, 2, 3, 4, 5}){}

const std::vector<T> getContainer() const { return vect_;}
};

并且我将多个对象存储在 boost::any

的容器中

当我遍历时,我想遍历从 std::vector 继承的元素。

我做了以下事情(有效)

  Base<int>     a;
boost::any c = static_cast<decltype(a.getContainer())>(a);
try
{
for (auto elem : boost::any_cast<std::vector<int>>(c))
std::cout << elem << std::endl;
}
catch (boost::bad_any_cast)
{}

我想知道是否有其他方法可以做这种事情,因为看起来你不能 boost::any_cast 进入父类。

最佳答案

假设这个假设的容器支持begin/end:

template<typename TContainer>
void do_foo(TContainer const& c) {
for (auto const& i : c)
foo(i);
}

转换任何像你正在做的事情都是对泛型编程工作方式的严重误解。

如果您想要一个包含这些不同容器的容器,使用新的 Boost.TypeErasure any 可能会对您有所帮助。我认为您将需要谓词,例如

BOOST_TYPE_ERASURE_MEMBER((has_begin), begin, 0)
BOOST_TYPE_ERASURE_MEMBER((has_end), end, 0)

但是,这种方法(充其量)是不完整的。根据@R.Martinho Fernandes 的建议,此类型不允许您使用 for 范围内的所有内容。所有的 std 容器都可以使用 std::beginstd::end,它们是通过 ADL 找到的,这些函数可以为你找到容器也是。您需要类似的东西才能真正涵盖在这里。

这说明了另一点:为什么?

关于c++ - 如何循环继承自 boost::any 中包含的 std::vector 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com