C++ 如何最好地处理从const char到模板类型的转换*

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

我有一个模板函数,在这个函数中,我需要将const char*转换为我的模板值。 我知道这个常量字符*最初是从ascii文本文件读取的。我当前的代码如下所示:


    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
要求您的类型在默认情况下具有可用的