如何在输入流中接受多种数据类型?

How can I accept multiple data types into my input stream?

本文关键字:数据类型 输入流      更新时间:2023-10-16
template< typename T >
void somefunction()
{
   T value;
   cout << " value = ";
   cin >> value;
}

现在看起来有点奇怪,但是我们可以有一个接受多个的函数模板吗数据类型(如float和int)。

如果你想将模板限制为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;
};

如果希望限制模板函数,最好的方法是使用专门化。创建一个泛型方法,它不做任何事情,或断言/抛出异常,但具有针对您的类型的专门实现。类似的,

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的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…

这是可能的。如果数据类型支持operator >>(和operator <<,如果你想打印它)