gpt4 book ai didi

c++ - 传递 `boost::variant` 数据类型的优雅方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:36 25 4
gpt4 key购买 nike

我需要找到一个更好的解决方案来将数据类型传递给 boost::variant 以便函数可以优雅地检索存储的变量类型。我已经提出了一个适合我的实现,但我担心有更好的方法。

// file name: p192.cpp
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <boost/variant.hpp>

using namespace std;

enum TypePassIn
{
INT_TYPE,
DOUBLE_TYPE,
STRING_TYPE,
PERSON_TYPE,
LAST_TYPE = PERSON_TYPE
};

struct Person
{
Person(int _age, string _name) : age(_age), name(_name) {}
int age;
string name;
};

void PrintVariant(map<string, boost::variant<int, double, string, Person> > _mapValues, TypePassIn tpi)
{
switch(tpi)
{
case INT_TYPE:
cout << boost::get<int>(_mapValues["int"]) << endl;
break;
case DOUBLE_TYPE:
cout << setprecision (15) << boost::get<double>(_mapValues["double"]) << endl;
break;
case STRING_TYPE:
cout << boost::get<string>(_mapValues["string"]) << endl;
break;
case PERSON_TYPE:
cout << "Age: " << (boost::get<Person>(_mapValues["Person"])).age;
cout << ", Name: " << (boost::get<Person>(_mapValues["Person"])).name << endl;
break;
default:
break;
}
}

int main(void)
{ map<string, boost::variant<int, double, string, Person> > mapValues;

mapValues["int"] = 10;
PrintVariant(mapValues, INT_TYPE);

mapValues["double"] = 100.99;
PrintVariant(mapValues, DOUBLE_TYPE);

mapValues["string"] = "Hello world";
PrintVariant(mapValues, STRING_TYPE);

mapValues["Person"] = Person(10, "Tom");
PrintVariant(mapValues, PERSON_TYPE);
}

~/Documents/C++/boost $ ./p192
10
100.99
Hello world
Age: 10, Name: Tom

从上面的代码可以看出,实现的方法既可以处理原生类型,也可以处理自定义数据类型。在理想情况下,我们可以在不引入 enum TypePassIn

的情况下做到这一点

最佳答案

您可以使用(静态)visitor pattern ,如Boost.Variant的教程所示.

struct VariantPrinter : boost::static_visitor<void>
{
void operator()(int int_val)
{
std::cout << int_val << std::endl;
}
void operator()(double double_val)
{
std::cout << std::setprecision(15) << double_val << std::endl;
}
// etc.
};

void PrintVariant(const boost::variant<...>& the_variant)
{
boost::apply_visitor(VariantPrinter(), the_variant);
}

int main()
{
std::map<std::string, boost::variant<...> > mapValues;

mapValues["int"] = 10;
PrintVariant(mapValues["int"]);

}

关于c++ - 传递 `boost::variant` 数据类型的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com