Как я могу принять несколько типов данных в мой поток ввода? - PullRequest
0 голосов
/ 04 мая 2011
template< typename T >
void somefunction()
{
   T value;
   cout << " value = ";
   cin >> value;
}

Теперь это кажется немного странным, но можем ли мы иметь шаблон функции, который принимает несколько типов данных (скажем, float и int).

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Если вы хотите ограничить шаблон int и float, вам нужно будет специализировать ваш шаблон:

template< typename T >
void somefunction()
{
   // May be throw std::bad_typeid
};

template<>
void somefunction<int>()
{
   int value;
   cout << " int value = ";
   cin >> value;
};

template<>
void somefunction<float>()
{
   float value;
   cout << " float value = ";
   cin >> value;
};
1 голос
/ 04 мая 2011

Если вы хотите ограничить функцию шаблона, лучше всего использовать специализацию .Создайте универсальный метод, который ничего не делает или выдает / выбрасывает исключение, но со специализированными реализациями именно для ваших типов.Что-то вроде

template< typename T >
void somefunction()
{
    std::cerr << "Not implemented." << std::endl;
}

template< >
void somefunction< float >()
{
   T value;
   cout << " value (float) = ";
   cin >> value;
}

template< >
void somefunction< int >()
{
   int value;
   cout << " value (int) = ";
   cin >> value;
}

Конечно, при добавлении большего количества типов (double, long, char и т. Д.) Это может означать дублирование кода.В качестве альтернативы вы можете попробовать использовать Boost's enable_if .

. В альтернативном случае, когда вы хотите загрузить два значения одновременно, вам необходимо представить два аргумента шаблона:

template< typename T1, typename T2 >
void somefunction()
{
   T1 first;
   std::cout << " first value = ";
   std::cin >> first ;

   assert( std::cin.good() );
   T2 second;
   std::cout << " second value = ";
   std::cin >> second ;
}

Также убедитесь, что в более сложных случаях вы правильно проверяете исправное / неудачное состояние вашего входного потока (cin).Для упрощения я использовал assert ...

1 голос
/ 04 мая 2011

Да возможно. Если тип данных поддерживает operator >>operator <<, если вы хотите его напечатать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...