使用boost :: variant C ++进行隐式运算符重载

时间:2017-09-02 03:36:27

标签: c++ boost operator-overloading implicit-conversion boost-variant

任何人都可以指导我如何解决这个问题。 我有一个boost :: variant。

typedef boost::variant <
int,
std::string,
bool,
double,
vector<int>,
vector<string>,
vector<bool>,
vector<double>
> boostVar;

我正在尝试创建重载[]运算符作为类ABC的成员函数(这只是一个虚拟实现)

class ABC
{
    //some map of (key, value) pair that where key is string and value is of type boostVar
    boostVar [](const string key)
    {
       boostVar temp;
       //some operation that fills up temp based on value of key
       return temp;
    }
}

因此,在使用此实现检索特定值时,它会强制用户指定

int key1Val         = boost::get<int>(ABC["KEY1"]);
bool key2Val        = boost::get<bool>(ABC["KEY2"]);
vector<int> key3Val = boost::get<vector<int>>(ABC["KEY3"]);

我的问题是:

如果我想访问以下(i.e. without boost::get<>)

之类的值,我应该如何实施此功能
int key1Val         = ABC["KEY1"];
bool key2Val        = ABC["KEY2"];
vector<int> key3Val = ABC["KEY3"];

如果说:KEY1与int不匹配,KEY2与bool不匹配等,则实现应该向用户发出警告。

1 个答案:

答案 0 :(得分:1)

您需要使用类来包装boost变体并添加转换行为。最简单的 - 在常见的情况下,现实的客户端代码不会尝试delete使用指向基础(boost::variant<...>*的指针来动态分配实例 - 它看起来像这样:

struct Variant : boost::variant<int, std::string, ...etc...>
{
    operator int() const { return boost::get<int>(*this); }
    operator std::string() const { return boost::get<std::string>(*this); }
    ...etc...
};

这将提供get<>提供的相同检查:编译时间检查您尝试分配其中一个变种可以的类型在运行时保持,并且当您尝试从中分配时,运行时会检查它确实保留了确切的目标类型。

如果您无法确定客户端代码是否通过基类指针获得delete,请考虑私有继承或组合(您需要做更多工作来公开任何其他{{1}您的客户端代码可能想要访问的功能。)

variant只能返回ABC::operator[](const std::string& key) const}。