2015-05-20 150 views
0

我有一個可以接受各種類型的模板類:int,double等。我想檢查用戶是否輸入了正確的類型。如果對象是用int實例化的,那麼用戶應該輸入一個int,如果它是double,他應該輸入一個double等等。無論輸入來自文件還是鍵盤,我都希望能夠做到這一點。我有2個問題。檢查輸入的類型是否正確

  1. 我應該在「>>」運算符重載的定義中進行檢查嗎?
  2. 如何檢查?我是否創建了一個檢查任何類型的模板函數?

我想是這樣的:

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; 
} 
+0

'X.a'必須是'Ttype',因爲您聲明它是。如果你真的想檢查你可以'static_assert(std :: is_same :: value,「不一樣」);'但是它永遠不會觸發。 –

+0

你可以使用boost :: spirit,參見[here](http://www.boost.org/doc/libs/1_58_0/libs/spirit/doc/html/spirit/abstracts/attributes/primitive_attributes.html)和[這裏](http://www.boost.org/doc/libs/1_58_0/libs/spirit/doc/html/spirit/qi/reference/numeric.html) –

回答

1

不能檢查輸入您已經閱讀它。我能想到的唯一方法是將輸入讀入一個字符串(它總是適用於文本文件或stdin),並嘗試將其轉換爲您的預期類型。轉換時可以查找異常。

+0

如何檢查類型是否匹配?我在Ttype上使用typeinfo嗎? – Andy

+0

只需使用轉換方法並檢查是否發生異常。你可以爲幾種類型專門化你的模板函數,並在每個類型中調用正確的轉換方法(比如'atoi' /'atof'或者一些STL等價物(如果有的話))。 –

+0

這些函數都沒有引發異常。 –

1

看起來你只是想嘗試從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; 
    } 
} 
+0

我很欣賞這個解決方案。但另外兩個想法。 我不是很確定,但不會對最後一次讀取操作(EOF)造成麻煩嗎?導致EOF將設置失敗位,但它不是真正的錯誤。我可能在這裏錯了。也許額外的檢查有助於確定它是否是EOF。像明確地檢查'fail()',如果這是真的,也檢查它是不是'eof()'。 第二個想法。這會失敗嗎?如果輸入類似'5.0',那麼'int'? –

+0

只有在您嘗試讀取流*末尾*之後才設置'eof'。如果你輸入了'1 2.0 3'之類的東西,它會失敗,如果你做了'1 2 3.5',它會成功,但將'.5'留在流中。如果你想解決這個問題,那麼你將不得不將輸入作爲字符串來使用。從那裏移動的精確度並不是最明顯的。您可以爲每個字符串創建一個字符串流,並檢查整個流是否已被使用。 –

相關問題