我想在C ++中使用boost库(boost :: variant)来定义整数和字符串的向量。我正在努力填写这样一个向量 - 有人可以使用Boost库发布带有ints
和strings
的向量的示例代码并读取向量的元素或以其他方式指导我做一个例子。
我在SO上搜索了boost::variants
的文章,但找不到我想要的内容。
答案 0 :(得分:1)
以下是一些例子(从记忆中写出):
typedef boost::variant<
std::string,
int
> StringOrInt; // using a typedef is just for convenience
StringOrInt myVariant;
myVariant = std::string("hello"); // both of these work
myVariant = 5;
std::vector<StringOrInt> myvec;
myvec.push_back(5);
myvec.push_back(std::string("hello"));
然后阅读,有两种方法。一个是使用boost :: get,另一个是使用访问者。访问者通常更健壮,但如果它是一个简单的案例,boost :: get可以很好地工作。
std::string& mystr = boost::get<std::string>(myvec[0]); // this will throw if the type you requested isn't what's stored
std::string* mystr = boost::get<std::string*>(myvec[0]); // pointer version doesn't throw
由于您可能正在迭代,访问者可能会更好地工作。您可以为变量中的每种类型创建一个重载的仿函数,并使用boost::apply_visitor
。例如:
struct MyVisitor {
void operator()(const std::string& arg) const {
std::cout << "It was a string";
}
void operator()(int arg) const {
std::cout << "It was an int";
}
};
MyVisitor myVisitor;
for (auto& val : myvec) {
boost::apply_visitor(myVisitor, val);
}
答案 1 :(得分:0)
你可以创建一个字符串向量,然后在带数字的位置使用.toString()。或者至少在Java中你可以创建一个类VectorIntString,该类的每个实例都有两个向量。所以当你构造对象时: 你会做这样的事情
VectorIntString vec= new VectorIntString(int a,String a, int b, String b.... ,);
因此构造函数会将优势位置添加到Int矢量,甚至将位置添加到String矢量。