C++ 如何最好地处理从const char到模板类型的转换*
我有一个模板函数,在这个函数中,我需要将const char*转换为我的模板值。 我知道这个常量字符*最初是从ascii文本文件读取的。我当前的代码如下所示:C++ 如何最好地处理从const char到模板类型的转换*,c++,templates,type-conversion,C++,Templates,Type Conversion,我有一个模板函数,在这个函数中,我需要将const char*转换为我的模板值。 我知道这个常量字符*最初是从ascii文本文件读取的。我当前的代码如下所示: template <typename T> bool Get(T &value, std::string const &query, T const &default) { const char* result = DataHandler.GetValue(qu
template <typename T>
bool Get(T &value, std::string const &query, T const &default)
{
const char* result = DataHandler.GetValue(query);
if (result != NULL)
{
value = static_cast<T>(result); //Here is the issue
return true;
}
value = default
return false;
}
模板
bool Get(T&value,std::string const&query,T const&default)
{
const char*result=DataHandler.GetValue(查询);
如果(结果!=NULL)
{
value=static_cast(result);//问题是
返回true;
}
值=默认值
返回false;
}
以int为例,我得到了错误
错误C2440:“static_cast”:无法从“const char*”转换为“int”
有没有办法把字符*无缝地转换成我的T型,我找不到答案
在最坏的情况下,我可以为我期望的10种类型做一个例子,如果不是其中的一种,我会给出一个错误,但如果可能的话,我宁愿不这样做
有没有办法把字符*无缝地转换成我的T型
没有
无法使从字符串到类型的转换自动适用于所有类型。必须为每个类实现这种转换。通常,它是通过为std::istream
实现流提取操作符>
来完成的。内置类型(如int
)和一些标准类型(如std::string
)已经有了这样的运算符。然后您可以执行以下操作,例如:
std::istringstream istream(result);
int i;
istream >> i;
struct SomeMPEGObject
{
SomeMPEGObject() {}
SomeMPEGObject(const char *) {}
};
struct MPEGConverter
{
static SomeMPEGObject Convert(const char *result)
{
return SomeMPEGObject(result);
}
};
//...
SomeMPEGObject mpeg;
Get<SomeMPEGObject, MPEGConverter>(mpeg, "12345", mpeg);
有没有办法把字符*无缝地转换成我的T型
没有
无法使从字符串到类型的转换自动适用于所有类型。必须为每个类实现这种转换。通常,它是通过为std::istream
实现流提取操作符>
来完成的。内置类型(如int
)和一些标准类型(如std::string
)已经有了这样的运算符。然后您可以执行以下操作,例如:
std::istringstream istream(result);
int i;
istream >> i;
struct SomeMPEGObject
{
SomeMPEGObject() {}
SomeMPEGObject(const char *) {}
};
struct MPEGConverter
{
static SomeMPEGObject Convert(const char *result)
{
return SomeMPEGObject(result);
}
};
//...
SomeMPEGObject mpeg;
Get<SomeMPEGObject, MPEGConverter>(mpeg, "12345", mpeg);
在不确切了解您的要求的情况下,使用@eerorika给出的答案,以下是进行转换的一般方法:
#include <sstream>
#include <string>
#include <iostream>
template <typename T>
struct DefaultConverter
{
static T Convert(const char *result)
{
std::istringstream istream(result);
T i;
istream >> i;
return i;
}
};
template <typename T, typename Converter = DefaultConverter<T>>
bool Get(T &value, std::string const &query, T const &defaultVal)
{
const char* result = "100";
value = Converter::Convert(result);
return true;
}
int main()
{
int test = 10;
Get(test, "abc123", test);
std::cout << test;
}
这将在不更改
Get
函数中的任何代码的情况下工作。在不确切了解您的要求的情况下,使用@eerorika给出的答案,以下是执行转换的一般方法:
#include <sstream>
#include <string>
#include <iostream>
template <typename T>
struct DefaultConverter
{
static T Convert(const char *result)
{
std::istringstream istream(result);
T i;
istream >> i;
return i;
}
};
template <typename T, typename Converter = DefaultConverter<T>>
bool Get(T &value, std::string const &query, T const &defaultVal)
{
const char* result = "100";
value = Converter::Convert(result);
return true;
}
int main()
{
int test = 10;
Get(test, "abc123", test);
std::cout << test;
}
这将在不更改
Get
函数中的任何代码的情况下工作。添加一个专门针对您支持的每种类型的转换函数。转换字符串有多种解释,例如,可以将“0xFF”转换为255,也可以不支持十六进制。您需要决定您支持哪一个,并将它们添加到(有一些可爱的标准函数,比如atoi,可以提供帮助)这个字符串中的数据是什么?键入数字的ASCII表示法?原始值的逐位副本?您是否正在将文本楼梯到天堂
转换为MP3?没有一种方法可以将“ASCII”转换为任意对象类型。这个问题不够清晰。处理这个问题的一般方法是将转换模板化,并将其作为模板参数添加,将该参数默认为合理的参数,如果您想做一些深奥的事情,则进行自定义。此外,您的函数返回的是bool
,因此返回true
或false
,而不是1
和0
。添加一个专门针对您支持的每种类型的转换函数。转换字符串有多种解释,例如可以将“0xFF”转换为255,或者不支持十六进制。您需要决定您支持哪一个,并将它们添加到(有一些可爱的标准函数,比如atoi,可以提供帮助)这个字符串中的数据是什么?键入数字的ASCII表示法?原始值的逐位副本?您是否正在将文本楼梯到天堂
转换为MP3?没有一种方法可以将“ASCII”转换为任意对象类型。这个问题不够清晰。处理这个问题的一般方法是将转换模板化,并将其作为模板参数添加,将该参数默认为合理的参数,如果您想做一些深奥的事情,则进行自定义。此外,您的函数正在返回bool
,因此返回true
或false
,而不是1
和0
,这看起来非常好,是否有地方可以查找哪些类型已经实现了>>运算符,哪些类型我必须重载/提供我自己的转换器?让编译器来完成这项工作。如果类型有一个操作符>
ok,如果没有,编译器将给出一个错误。想法是Get
函数应该被记录下来,默认值将调用类型上的>
,任何自定义(或者如果类型没有>
重载),然后提供自定义转换类型。这与,比如说,std::sort
要求您的类型在默认情况下具有可用的
,另一个需要指定转换函数。这看起来非常好,是否有地方可以查找哪些类型已经实现了>>运算符,哪些类型我必须重载/提供我自己的转换器?让编译器来完成这项工作。如果类型有一个操作符>
ok,如果没有,编译器将给出一个错误。想法是Get
函数应该被记录下来,默认值将调用类型上的>
,任何自定义(或者如果类型没有>
重载),然后提供自定义转换类型。这与,比如说,std::sort
要求您的类型在默认情况下具有可用的