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