免責事項: これはお勧めしません。
しかし、あなたが主張するなら、ここにそのような忌まわしさの始まりがあります:
#include <vector>
#include <memory>
#include <functional>
#include <boost/any.hpp>
class any_vector
{
using any = boost::any;
struct concept
{
virtual any at(std::size_t) = 0;
virtual any at(std::size_t) const = 0;
virtual ~concept() = default;
};
template<class T>
struct model : concept
{
model(std::vector<T> v) : _data(std::move(v)) {}
virtual any at(std::size_t i) override { return boost::any(std::ref(_data.at(i))); }
virtual any at(std::size_t i) const override { return boost::any(std::cref(_data.at(i))); }
std::vector<T> _data;
};
concept& deref() { return *vec_; }
concept const& deref() const { return *vec_; }
std::unique_ptr<concept> vec_;
public:
boost::any at(std::size_t i) const { return deref().at(i); }
boost::any at(std::size_t i) { return deref().at(i); }
template<class T>
any_vector(std::vector<T> v)
: vec_(std::make_unique<model<T>>(std::move(v)))
{}
};
int main()
{
any_vector a(std::vector<int> { 1, 2, 3 });
any_vector b(std::vector<double> { 1.1, 2.2, 3.3 });
std::vector<any_vector> va;
va.push_back(std::move(a));
va.push_back(std::move(b));
auto anything = va.at(0).at(1);
// how you deal with the resulting `any` is up to you!
}
any_vector::at(x) は、const-ref または何らかのオブジェクトへの ref を含む boost::any を返すことに注意してください。
それが何であるかを推測し、それを使用する有用なコードを書くことは、挑戦になるでしょう...