gpt4 book ai didi

c++ - C++读取不同类型的数据

转载 作者:搜寻专家 更新时间:2023-10-31 01:25:55 25 4
gpt4 key购买 nike

我想要一个程序来读取像这样的字符串:

integer_value    1

double_value 1.0

string_value one

为了阅读这些内容,我实现了以下功能:

void read_val_int( 
std::vector<std::string> str_vec,
std::string str,
int& val){
if(str_vec[0]==str) val= std::stoi(str_vec[1]);
}

void read_val_dbl(
std::vector<std::string> str_vec,
std::string str,
double& val){
if(str_vec[0]==str) val= std::stoi(str_vec[1]);
}

void read_val_str(
std::vector<std::string> str_vec,
std::string str,
std::string& val){
if(str_vec[0]==str) val= str_vec[1];
}

str_vec 是一个包含两个字符串值的 vector ,例如{“整数值”,“1”}。

str 包含我要与 str_vec[0]

比较的字符串

val 是整数、 double 或字符串,对应于 str_vec[1] 以防 str_vec[0]==str 为真.

我将这些函数用作,例如read_val_int(my_str_vec,"integer_value",my_int_val)

我的问题是:有没有一种方法可以使用一个单一的函数来做到这一点?我曾尝试使用模板,但由于我需要引用 val 这似乎是不可能的。


注意:我知道 this post但它是用 C 写的,对我来说似乎有点乱。也许在 C++ 中有更简单的方法来实现这一点。

最佳答案

如果您使用的是 C++17 之前的版本,因此无法使用 std::variant,则可以通过模板仅使用一个函数。

您声明函数如下:

template <typename T>
void read_val(const std::string & data, T & val);

然后针对三种类型专门化它:

template <>
void read_val<int>(const std::string & data, int & val)
{
val = std::stoi(data);
}
template <>
void read_val<double>(const std::string & data, double & val)
{
val = std::stod(data);
}
template <>
void read_val<std::string>(const std::string & data, std::string & val)
{
val = data;
}

工作完成了,您可以通过调用一个而且只有一个函数来为您的三种类型使用该函数:read_val()

您可以按如下方式使用它:

std::string data_int("5");
std::string data_double("2.5");
std::string data_string("Hello");

int int_val;
double double_val;
std::string string_val;

read_val(data_int, int_val);
read_val(data_double, double_val);
read_val(data_string, string_val);

std::cout << int_val << std::endl;
std::cout << double_val << std::endl;
std::cout << string_val << std::endl;

如您所见,通过使用模板特化,您可以对不同类型使用相同的函数。

此外,它会自动向您保证传递了允许的类型。事实上,如果你给函数提供的不是 intdoublestd::string ,编译就会失败,因为没有特化。

希望对你有帮助。

关于c++ - C++读取不同类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140667/

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