2015-07-11 2 views
0

Так что я иду от Java, где вы можете сделать что-то вроде этого при использовании сканераПрочтите из ввода в декларации в C++?

int n = s.nextInt(); 

Теперь, когда я баловаться с C++, я нахожу это раздражает, чтобы сделать:

int n; 
cin >> n; 

Есть ли сокращенный способ чтения с ввода в объявлении переменной?

+1

Как бы вам не понадобилось –

+0

Проводили ли пробелы в вашем сокращении? –

ответ

4

Вы можете просто сделать вспомогательную функцию, чтобы сделать это для вас:

// Using an anonymous namespace, since this is intended to 
// be just an internal utility for your file... it's not 
// a super awesome, shareable API (especially since it hard 
// codes the use of std::cin and has no error checking). 
namespace { 

// Helper function that reads an integer from std::cin. 
// As pointed out in Robin's solution, you can use a template 
// to handle other types of input, as well. 
int ReadInt() { 
    int result; 
    std::cin >> result; 
    return result; 
} 
} 

Тогда вы можете сделать:

int n = ReadInt(); 

Если вы действительно хотите идти на все, хотя, вы можете создать более сложное решение:

namespace input_utils { 
class IOException {}; 
class Scanner { 
    public: 
    Scanner() : input_(std::cin) {} 
    Scanner(std::istream& input) : input_(input) {} 

    template<typename T> T Read() { 
     CheckStreamOkay(); 
     T result; 
     input_ >> result; 
     CheckStreamOkay(); 
     return result; 
    } 

    private: 
    void CheckStreamOkay() { 
     if (!input_) { 
     throw IOException(); 
     } 
    } 
    std::istream& input_; 
}; 
} 

Затем вы можете сделать что-то вроде:

input_utils::Scanner scanner(std::cin); 
int a = scanner.Read<int>(); 
int b = scanner.Read<int>(); 
double c = scanner.Read<double>(); 
... 

Хотя в этот момент вам может потребоваться найти существующую библиотеку, которая уже делает это.

+0

Чтобы эмулировать поведение Java, вы должны выбросить исключение при сбое. Или вы должны хотя бы иметь * некоторый * способ указать ошибку здесь. –

+1

@BenjaminLindley, если мы действительно собираемся подражать Java-поведению, тогда у нас должен быть класс оболочки «Сканер», и он должен принимать произвольный «std :: istream» в качестве ввода, а не строго std :: cin. Я согласен с тем, что вы говорите, но OP просто спрашивал о простоте синтаксиса (и приведенный пример не делал никаких проверок). Это немедленно касается точки боли OPs, но вы правы, что для этого потребуется много улучшений, чтобы превратить в хороший API. –

+1

Приятный полный пример, связанный с этими ответами. +1 –

3

не Там будет никакого встроенной ярлык для этого, но вы могли бы, конечно, сделать свою собственную функцию для этого:

int read_int() { 
    int res; 
    cin >> res; 
    return res; 
} 
... 
int a = read_int(); 
3

Making функции, предложенного dasblinkenlight и Майкл Аарон Сафьян более общим с использованием шаблонов (в настоящее время включено в окончательный пример ответа Майкла):

#include <iostream> 

template<typename T> T read(); 

template<typename T> 
T read<T>() { 
    T ret; 
    std::cin >> ret; 
    return ret; 
} 

int main() { 
    int i = read<int>(); 
    double d = read<double>(); 
    std::cout << i << std::endl << d; 
    return 0; 
} 
Смежные вопросы