如何将变量类型作为参数函数插入
How to insert a variable type as a parameter function?
我有以下函数:
int readAndCheck () {
int n;
while (n < 2) {
try {
cout << "Please insert an integer bigger than one: ";
string check = "";
cin >> check;
n = boost::lexical_cast<int>(check);
} catch (boost::bad_lexical_cast&) {
cout << "Error!n";
}
}
return n;
}
我想概括该函数,以便它可以向用户输出任何请求并检查任何类型的请求。但我知道以下是不可能的:
checktype readAndCheck (string request, checktype) {
checktype n;
while (n < 2) {
try {
cout << request;
string check = "";
cin >> check;
n = boost::lexical_cast<checktype>(check);
} catch (boost::bad_lexical_cast&) {
cout << "Error!n";
}
}
return n;
}
如何创建一个包含类似 checktype 类型的变量(可能吗(?
为checktype的每个可能值创建一个通用的readAndCheck函数的方法是什么?
我问这个是因为必须为每个检查类型创建一个函数似乎很乏味。
解决方案:
#include <iostream>
#include <boost/lexical_cast.hpp>
template<typename CheckType>
CheckType readAndCheck(std::string request, CheckType n)
{
try {
std::cout << request;
std::string check = "";
std::cin >> check;
n = boost::lexical_cast<CheckType>(check);
} catch (boost::bad_lexical_cast&) {
std::cout << "Error!n";
}
return n;
}
int main()
{
int a = 0;
while (a < 2)
a = readAndCheck("Please insert a integer bigger than one: ", a);
std::cout << a << "n";
return 0;
}
C++的几个支柱之一是一个名为template
s的功能,它们存在的(许多(主要原因之一正是为了缓解这种情况,否则需要非常重复的代码。
文档非常丰富,但简而言之,这个想法是声明一个 template
d 类或函数,使用泛型类型或整数(包括指针(模板参数作为实际类型或值的占位符。在您使用所有必需的参数实例化此模板并从中创建实际类型/代码之前,template
不是类型。
您可以通过类的声明(例如MyTemplate<Arguments> myInstance{ctor_args}
(或函数的声明(例如myFunc<OptionalArguments>(func_args)
;另请参阅下文(来实例化template
。您在实例化期间提供的参数被替换(以比宏更复杂的方式!(代替前面指定的占位符,最终创建一个具体的模板类(和相关代码(或函数,其中包含或作用于指定的类型/整数值。
对于更复杂的情况,可以显式专用模板,以便对不同的模板参数集采取不同的操作。也就是说,您可以指定一个可以处理大多数类型的泛型模板,但如果那里需要其他代码,则可以显式专用于给定的参数集。
模板函数通常不需要您显式指定模板参数,如果这些参数可以从调用站点明确推断(即通过函数参数的类型(。如果无法推断模板参数(例如,没有相应的函数参数(,则必须在调用时提供它们,就像实例化模板类时一样<Brackets>
。
我现在无法测试代码(我也不知道boost::lexical_cast
是如何工作的(,但你的简单情况是这样的:
// Return a new instance - can't deduce type, must specify at call site
// Call like: auto checked{ readAndCheck<YourType>(yourRequest) };
template<typename T_CheckType>
T_CheckType readAndCheck(std::string request)
{
// assumes T_CheckType not initialised with gibberish:
T_CheckType n;
while (n < 2) { // assumes T_CheckType convertible to int
try {
std::cout << request;
std::string check = "";
std::cin >> check;
n = boost::lexical_cast<T_CheckType>(check);
} catch (boost::bad_lexical_cast&) {
std::cout << "Error!n"; // may return invalid instance
}
}
return n;
}
// XOR
// Write result to passed output parameter - enables deduction from arg #2
// Call like: readAndCheck(yourRequest, yourOutputParameter);
template<typename T_CheckType>
void readAndCheck(std::string request, T_CheckType &output_checked)
{
// reinitialise output_checked here if required
while (output_checked < 2) { // assumes T_CheckType convertible to int
try {
std::cout << request;
std::string check = "";
std::cin >> check;
output_checked = boost::lexical_cast<T_CheckType>(check);
} catch (boost::bad_lexical_cast&) {
std::cout << "Error!n";
}
}
}
否则,所有关于学习模板的文档都应该对您有所帮助;-(
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类