如何将变量类型作为参数函数插入

How to insert a variable type as a parameter function?

本文关键字:参数 函数 插入 类型 变量      更新时间:2023-10-16

我有以下函数:

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;
}
  1. 如何创建一个包含类似 checktype 类型的变量(可能吗(?

  2. 为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";
        }
    }
}

否则,所有关于学习模板的文档都应该对您有所帮助;-(