任何人都可以指导我如何解决这个问题。 我有一个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不匹配等,则实现应该向用户发出警告。
答案 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
}。