C++ 如何在输入流中接受多种数据类型? 模板 void函数() { T值; cout>值; }

C++ 如何在输入流中接受多种数据类型? 模板 void函数() { T值; cout>值; },c++,templates,C++,Templates,现在这看起来有点奇怪,但是我们可以有一个接受多个函数的函数模板吗 数据类型(比如float和int)。是的这是可能的。如果数据类型支持operator>(和operator是),则是可能的。如果数据类型支持operator>(和operator如果要将模板限制为int和float,则必须专门化模板: template< typename T > void somefunction() { T value; cout << " value = "; cin

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

是的这是可能的。如果数据类型支持
operator>
(和
operator),则是可能的。如果数据类型支持
operator>
(和
operator如果要将模板限制为int和float,则必须专门化模板:

template< typename T >
void somefunction()
{
   T value;
   cout << " value = ";
   cin >> value;
}
模板
void函数()
{
//可能是std::bad_typeid
};
模板
void函数()
{
int值;
cout>值;
};
模板
void函数()
{
浮动值;
cout>值;
};

如果要将模板限制为int和float,则必须专门化模板:

template< typename T >
void somefunction()
{
   T value;
   cout << " value = ";
   cin >> value;
}
模板
void函数()
{
//可能是std::bad_typeid
};
模板
void函数()
{
int值;
cout>值;
};
模板
void函数()
{
浮动值;
cout>值;
};

如果您希望限制模板功能,最好使用。创建一个不执行任何操作的泛型方法,或断言/抛出异常,但要针对您的类型使用专门的实现。例如

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;
};
模板
void函数()
{
标准:cerr()
{
T值;
cout>值;
}
模板<>
void somefunction()
{
int值;
cout>值;
}
当然,当添加更多类型(double、long、char等)时,这可能意味着重复代码

另一种情况是,如果希望同时加载两个值,则需要提供两个模板参数:

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;
}
模板
void函数()
{
T1优先;
std::cout>第一;
断言(std::cin.good());
T2秒;
std::cout>second;
}

在更复杂的情况下,还要确保正确检查输入流(cin)的良好/失败状态。简单地说,我使用了一个assert…

如果您希望限制模板函数,最好使用。创建一个不做任何事情的泛型方法,或assert/throws exception,但具有针对您的类型的专门实现。例如

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;
};
模板
void函数()
{
标准:cerr()
{
T值;
cout>值;
}
模板<>
void somefunction()
{
int值;
cout>值;
}
当然,当添加更多类型(double、long、char等)时,这可能意味着重复代码

另一种情况是,如果希望同时加载两个值,则需要提供两个模板参数:

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;
}
模板
void函数()
{
T1优先;
std::cout>第一;
断言(std::cin.good());
T2秒;
std::cout>second;
}

此外,还要确保在更复杂的情况下正确检查输入流(cin)的良好/失败状态。为了简单起见,我使用了一个断言…

如果可能,请说明您将如何使用它。请告诉我们“接受多个数据类型”是什么意思。您希望将模板函数限制为仅浮点或int?还是希望从输入流中读取一个intá和一个float?@unaperson,他唯一可以使用的方法是
somefunction()
等等。是的,希望将模板函数限制为仅使用浮点或int。但第二个意见对我来说也很有趣,我想了解这两个方面。如果可能,请说明您将如何使用此功能。请告诉我们“接受多个数据类型”是什么意思。您希望将模板函数限制为仅浮点或int?还是希望从输入流中读取一个intá和一个float?@unaperson,他唯一可以使用的方法是
somefunction()
等等。是的,我希望将模板函数限制为仅使用浮点或int。但是第二个意见对我来说也很有趣,我想知道这两个方面的情况。是否可以在此举个例子?是否可以在此举个例子?谢谢,@Andre@Olwaro也给出了类似的答案,但这对我有更多帮助。谢谢,@Andre。@Olwaro也给出了类似的答案,但这对我帮助更大。