生成带有 int 和字符串参数的向量
Generating a vector with int and string arguments
我想使用 C++ 中的 boost 库 (boost::variant) 来定义整数和字符串的向量。我正在努力填充这样一个向量 - 有人可以 post 示例代码使用 ints
和 strings
使用 Boost 库 [=18= 填充向量吗? ] 并读取向量的元素或以其他方式指导我查看示例。
我在 SO 上搜索了带有 boost::variants
标签的文章,但没有找到我想要的。
您可以创建一个字符串向量,然后在带有数字的位置使用 .toString()。或者至少在 Java 中,您可以创建一个 Class VectorIntString,其中 class 的每个实例都具有两个向量。所以当你构造对象时:
你会做这样的事情
VectorIntString vec= new VectorIntString(int a,String a, int b, String b.... ,);
因此构造函数会将奇数位置添加到 Int 向量,偶数位置添加到字符串向量。
这里有一些例子(凭记忆写的):
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,另一种是使用访问者。 Visitor 通常更健壮一些,但如果是简单的情况,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);
}
我想使用 C++ 中的 boost 库 (boost::variant) 来定义整数和字符串的向量。我正在努力填充这样一个向量 - 有人可以 post 示例代码使用 ints
和 strings
使用 Boost 库 [=18= 填充向量吗? ] 并读取向量的元素或以其他方式指导我查看示例。
我在 SO 上搜索了带有 boost::variants
标签的文章,但没有找到我想要的。
您可以创建一个字符串向量,然后在带有数字的位置使用 .toString()。或者至少在 Java 中,您可以创建一个 Class VectorIntString,其中 class 的每个实例都具有两个向量。所以当你构造对象时: 你会做这样的事情
VectorIntString vec= new VectorIntString(int a,String a, int b, String b.... ,);
因此构造函数会将奇数位置添加到 Int 向量,偶数位置添加到字符串向量。
这里有一些例子(凭记忆写的):
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,另一种是使用访问者。 Visitor 通常更健壮一些,但如果是简单的情况,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);
}