В приведенном ниже коде используется вариант повышения std :: map, который содержит пары int/MyVariant. Я могу правильно инициализировать свою карту, где первый элемент содержит пару 33/A, а второй содержит пар 44/B. А и В имеют функцию, что я хотел бы иметь возможность вызывать после получения соответственно их инициализированный элемент карты:Каков правильный синтаксис варианта C++ для вызова функции-члена, заданной для конкретного варианта?
#include "stdafx.h"
#include "boost/variant/variant.hpp"
#include "boost/variant/get.hpp"
#include "boost/variant/apply_visitor.hpp"
#include <map>
struct A { void Fa() {} };
struct B { void Fb() {} };
typedef boost::variant< A, B > MyVariants;
typedef std::map< const int, MyVariants > MyVariantsMap;
typedef std::pair< const int, MyVariants > MyVariantsMapPair;
struct H
{
H(std::initializer_list<MyVariantsMapPair> initialize_list) : myVariantsMap(initialize_list) {}
MyVariantsMap myVariantsMap;
};
int main()
{
H h { { 33, A {} }, { 44, B { } } };
auto myAVariant = h.myVariantsMap[ 33 ];
auto myBVariant = h.myVariantsMap[ 44 ];
A a;
a.Fa(); // ok
// but how do I call Fa() using myAVariant?
//myAVariant.Fa(); // not the right syntax
return 0;
}
Что бы правильный синтаксис, что делать?
вы пробовали 'увеличить :: получить (myAVariant) .Fa()'? –
Да. Проблема в том, что вариантная информация должна применяться дважды. Однажды при вставке пары карт и один раз при ее получении. Должен быть ИМО только один раз. – rtischer8277
С точки зрения компилятора с помощью варианта вы удаляете информацию о том, что такое переменная реального типа. C++ по-прежнему является строго типизированным языком, и поэтому информация должна быть в какой-то момент предоставлена обратно ... –