C++ 检查输入类型是否正确

C++ 检查输入类型是否正确,c++,validation,templates,input,C++,Validation,Templates,Input,我有一个模板类,可以采取各种类型:int,double等。我想检查用户是否输入了正确的类型。如果对象是用int实例化的,用户应该输入int,如果是用double实例化的,他应该输入double,依此类推。我希望能够做到这一点,无论输入来自文件还是键盘。我有两个问题 我应该检查“>>”操作符重载的定义吗 我怎么检查?我是否创建了检查任何类型的模板函数 我想要这样的东西: template <class Ttype> class foo { Ttype a,b,c;

我有一个模板类,可以采取各种类型:int,double等。我想检查用户是否输入了正确的类型。如果对象是用int实例化的,用户应该输入int,如果是用double实例化的,他应该输入double,依此类推。我希望能够做到这一点,无论输入来自文件还是键盘。我有两个问题

  • 我应该检查“>>”操作符重载的定义吗
  • 我怎么检查?我是否创建了检查任何类型的模板函数
  • 我想要这样的东西:

    template <class Ttype>
    class foo 
    {
        Ttype a,b,c; 
        friend istream &operator>> <>( istream &input, foo<Ttype> &X );
        //methods
    };
    
    template <class Ttype> istream &operator>>( istream &input, foo<Ttype> &X )
    {
        //check if X.a,X.b,X.c are of Ttype
        input>>X.a>>X.b>>X.c;
    }
    
    int main()
    {
        foo<int> a;
        cin>>a;
    
        foo<double> b;
        cin>>b;
    
        return 0;
    }
    
    模板
    福班
    {
    t a、b、c型;
    friend istream&operator>>(istream&input,foo&X);
    //方法
    };
    模板istream&operator>>(istream&input,foo&X)
    {
    //检查X.a、X.b、X.c是否为T类型
    输入>>X.a>>X.b>>X.c;
    }
    int main()
    {
    福阿;
    cin>>a;
    富b;
    cin>>b;
    返回0;
    }
    
    在阅读之前,您不能检查输入。我能想到的唯一一件事是将输入读入一个字符串(它始终适用于文本文件或stdin),并尝试将其转换为您期望的类型。转换时,您可以查找异常。

    您似乎只想尝试从
    istream中读取,如果读取失败,则失败。在这种情况下,您可以在提取操作后使用
    istream
    的隐式布尔相似性

    template <class T>
    class Foo {
        T a,b,c;
        friend std::istream& operator>>(std::istream& input, Foo& X ) {
          if (!(input >> X.a >> X.b >> X.c)) { // examine the istream
            std::cerr << "extraction failed\n";
          }
          return input;
        }
    }
    
    模板
    福班{
    Tα,b,c;
    friend std::istream&operator>>(std::istream&input,Foo&X){
    如果(!(输入>>X.a>>X.b>>X.c)){//检查istream
    
    std::cerr以及如何检查类型是否匹配?我是否在Ttype上使用typeinfo?只需使用转换方法并检查是否出现异常。您可以将模板函数专门化为几种类型,并在每种类型中调用正确的转换方法(如
    atoi
    /
    atof
    或启用时调用一些STL等效方法)。这两个函数都不会抛出异常。True。对于C++11,您可以使用
    std::stoi
    等等。否则,如果boost是一个选项,则
    boost::lexical\u cast
    可能会有用。
    X.a
    必须是
    Ttype
    ,因为您声明了它。如果您真的想检查,您可以
    static\u assert(std::is\u same::value),“不一样”);
    但这永远不会触发。您可以使用boost::spirit,请参阅,我很欣赏此解决方案。但还有两个想法。我不太确定,但这不会给上次读取操作(EOF)带来麻烦吗?原因EOF也会设置failbit,但它不是真正的错误。我在这里可能是错的。也许额外的检查有助于确定它是否是EOF。例如显式检查
    fail()
    ,如果这是真的,也检查它是否是
    EOF()
    。再想一想。如果输入类似于
    5.0
    ,例如
    int
    会失败吗?
    eof
    不会设置,直到您尝试读取流的末尾。如果您输入类似于
    12.03
    的内容,它会像预期的那样失败,如果您输入了
    1 2 3.5
    ,它会成功,但会保留
    .5de>在流中。如果要解决这个问题,则必须将输入作为字符串使用。如何从那里移动不是最清楚的。您可以为每个字符串创建一个字符串流,并检查是否使用了整个流。