Boost :: вариант членов подмножества другого Boost :: вариант

Я работаю с довольно неудобным интерфейсом c для хранения коллекций. Класс LowLevelStorer представляет оболочку, которую я написал для этого интерфейса. Storer класс является классом высокого уровня, который занимается Data, Он выполняет кэширование и объединяет данные в более сложные типы данных, известные только LowLevelStorer, Остальная часть моего кода центрируется только с Data и не знает LowLevelData,

В приведенном ниже примере кода я хочу, чтобы члены в Data вариант для включения в LowLevelData вариант. Есть ли способ указать это другое, как я это сделал?

Что я действительно не понимаю, так это то, почему приведенный ниже код компилируется, и действительно, почему он действительно работает правильно. То есть, void operator()(const SimplePath&, const Data& data) const принимает ссылку на данные, но, кажется, правильно преобразовывает ее в объект LowLevelData при вызове void operator()(const LowLevelData& data) const, Как это может быть?

Много ли происходит за кулисами копий моих объектов данных?

#include "boost/variant.hpp"#include "boost/variant/apply_visitor.hpp"#include <vector>

class Complex{};
typedef boost::variant< std::vector<Complex>, std::vector<int>, std::vector<std::string> > LowLevelData;

class LowLevelStorer
{
public:
LowLevelStorer(): _storeVisitor(StoreVisitor()){}

void operator()(const LowLevelData& data) const
{
boost::apply_visitor(_storeVisitor, data);
}

private:
class StoreVisitor: public boost::static_visitor<>
{
public:
void operator()(const std::vector<Complex>&) const {}

void operator()(const std::vector<int>& i) const {}

void operator()(const std::vector<std::string>&) const {}
};

StoreVisitor _storeVisitor;
};struct SimplePath{};
struct BundlePath{};
typedef boost::variant< SimplePath, BundlePath > Path;

typedef boost::variant< std::vector<std::string>, std::vector<int> > Data;

class Storer
{
public:
Storer(const LowLevelStorer& lowLevelStorer): _converter(Converter(lowLevelStorer)){}

void operator()(const Path& path, const Data& data) const
{
boost::apply_visitor(_converter, path, data);
}

private:
class Converter: public boost::static_visitor<>
{
public:
Converter(const LowLevelStorer& lowLevelStorer): _lowLevelStorer(lowLevelStorer){}

void operator()(const SimplePath&, const Data& data) const {
_lowLevelStorer(data);
}

void operator()(const BundlePath&, const Data& data) const {
_lowLevelStorer(std::vector<Complex>());
}
private:
const LowLevelStorer _lowLevelStorer;
};

const Converter _converter;
};

int main()
{
Storer storer((LowLevelStorer()));
std::vector<int> v;
v.push_back(13);
storer(Path(SimplePath()),v);

return 0;
}

0

Решение

Причина, по которой, когда вы указали параметр в качестве другого, требуется один вариант, я подозреваю, в том, что оба ваших варианта имеют все общие типы, что делает ваши варианты конвертируемыми друг в друга.

Я думаю, что было бы прекрасно просто использовать один вариант со всеми тремя типами и полностью пропустить другой, видя, что второй — просто подмножество типов первого.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector