使用 boost::variant C++ 的隐式运算符重载
Posted
技术标签:
【中文标题】使用 boost::variant C++ 的隐式运算符重载【英文标题】:Implicit operator overloading with boost::variant C++ 【发布时间】:2017-09-02 03:36:27 【问题描述】:谁能指导我如何解决这个问题。 我有一个 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】:您需要使用一个类来包装 boost 变体并添加转换行为。在最简单的情况下 - 在实际客户端代码不会尝试使用指向基 (boost::variant<...>*
) 的指针动态分配的实例的常见情况下 (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
,请考虑私有继承或组合(您需要做更多工作来公开您的客户端代码可能需要的任何其他variant
功能访问)。
(ABC::operator[](const std::string& key) const
只能返回这样的Variant
)。
【讨论】:
谢谢@Tony。我能够实现它。要学习这种“编码方式”,您能否推荐一些我可以阅读的书籍。我基本上希望在解决此类问题的同时发展我的方法。我想知道是否有任何书可以教您解决特定问题的不同方法/技巧。 @legameeternoforall:不客气。书籍 - 这是一个很大的问题(而且离题,尽管 S.O. 的 C++ 主题主页有推荐的书籍列表)。在一个层面上,“编码方式”是应用一种称为“适配器”的设计模式——你可以在Design Patterns 中以非常高的水平阅读这些内容。对于 C++ 模板黑客的温和介绍,我仍然推荐 Alexandrescu 的 Modern C++ Design。但是,我跟不上 C++ 书籍的发布,所以可能不是最好的人问.... 我发现这本书非常有用!这肯定会帮助我编写干净灵活的代码!以上是关于使用 boost::variant C++ 的隐式运算符重载的主要内容,如果未能解决你的问题,请参考以下文章
boost::variant 与 bool 和 string
C++,bool 转换是不是总是退回到 void* 的隐式转换?