Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用stringstream将字符串转换为数字_C++_Templates_Stringstream - Fatal编程技术网

C++ 使用stringstream将字符串转换为数字

C++ 使用stringstream将字符串转换为数字,c++,templates,stringstream,C++,Templates,Stringstream,我想实现如下功能: template <class C> C string_to_number(const string &s){ stringstream ss(s); C num; ss >> num; return num; } int main() { string s = "12.75"; double d = string_to_number(s); // be 12.75 int i = st

我想实现如下功能:

template <class C>
C string_to_number(const string &s){
    stringstream ss(s);
    C num;
    ss >> num;
    return num;
}
int main()
{
    string s = "12.75";
    double d = string_to_number(s); // be 12.75
    int i = string_to_number(s); // be 12
}

有人知道有什么办法吗?

模板参数
C
仅用作函数返回值的类型,而不是函数参数,不能使用

如果可能,编译器将从函数参数推断缺少的模板参数

必须显式指定模板参数,例如

double d = string_to_number<double>(s); // be 12.75
int i = string_to_number<int>(s); // be 12
double d=字符串到数字;//12点75分
int i=字符串到数字;//十二岁
走这条线

double d = string_to_number(s); // be 12.75
编译器必须实例化函数模板
string\u到\u number
。对于模板参数的推导,既没有显式的模板参数列表,也没有可从中推导的函数参数。除此之外,没有其他机制来推断模板参数。特别是,正如您的代码所建议的,模板参数推断将不考虑返回值

由于函数参数不依赖于模板参数,因此必须指定显式模板参数:

double d = string_to_number<double>(s); // be 12.75

可通过以下方式模拟退货类型扣减:

#包括
#包括
类别字符串到最终编号
{
公众:
字符串到字符串编号(常量标准::字符串和字符串)
:string_u{string}
{
}
字符串到编号(常量字符串到编号&)=删除;
模板
运算符类型()常量&&
{
std::stringstream string_stream{string_};
类型值;
字符串\u流>>值;
返回值;
}
私人:
const std::string和string_u2;;
};
// ...
std::string s=“12.75”;
双d=字符串到数字;//12点75分
int i=字符串到数字;//十二岁

auto d = string_to_number<double>(s); // be 12.75
#include <sstream>
#include <string>

class string_to_number final
{
public:
    string_to_number(const std::string& string)
        : string_{string}
    {
    }

    string_to_number(const string_to_number&) = delete;

    template <class Type>
    operator Type() const &&
    {
        std::stringstream string_stream{string_};
        Type value;

        string_stream >> value;

        return value;
    }

private:
    const std::string& string_;
};

// ...

std::string s = "12.75";
double d = string_to_number(s); // be 12.75
int i = string_to_number(s); // be 12