template< typename T >
void somefunction()
{
T value;
cout << " value = ";
cin >> value;
}
现在这看起来有点奇怪但是我们可以有一个接受多个的函数模板 数据类型(比如float和int)。
答案 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)的正常/失败状态。为了简单起见,我使用了断言......