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

时间:2011-05-04 08:00:12

标签: c++ templates

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

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

3 个答案:

答案 0 :(得分:3)

如果要将模板限制为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 :(得分:1)

这是可能的。如果数据类型支持operator >>(如果要打印,则为operator <<)。

答案 2 :(得分:1)

如果您希望限制模板功能,最好的办法是使用specialization。创建一个通用的方法,它不执行任何操作,或者断言/抛出异常,但是使用专门的实现来精确地处理类型。像,

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)的正常/失败状态。为了简单起见,我使用了断言......