为什么C++不能从赋值中推断出模板类型?

Mr.*_*Boy 16 c++ templates stl

int x = fromString("test"):无法推断'ValueType'的模板参数

int x = fromString<int>("test") :按预期正常工作

那么为什么编译器在这里挣扎呢?我用各种真实的模板函数看到它,而不仅仅是这个愚蠢的例子.它必须是语言的一个特征,但是什么?

Vla*_*lad 20

您无法根据返回类型推断出.但是,您可以使用重载的强制转换运算符实现具有类似语法的变通方法:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

class FromString{
private:
    string m_data;
public:
    FromString(const char*data) : m_data(data) {} 

    template<typename T>
    operator T(){
        T t;
        stringstream ss(m_data);
        ss >> t;
        return t;
    }

};

template<> FromString::operator bool(){
    return (m_data!="false"); //stupid example
}

int main(){

    int ans = FromString("42");    
    bool t = FromString("true");
    bool f = FromString("false");

    cout << ans << " " << t << " " << f << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

42 1 0
Run Code Online (Sandbox Code Playgroud)


Mar*_*tos 12

C++不对返回值进行类型推断.即,它被分配给int的事实不用于模板参数推导.

(删除了编辑,因为其他人已经提交了重载的强制转换解决方案.)