如何在c++中使用模板使变量通用化

How to use template to make variables generalized in c++?

本文关键字:变量 通用化 c++      更新时间:2023-10-16

我试图接受用户的输入,用户可以选择输入不同类型的输入(char,int float)。根据输入的值,我必须采取适当的行动。

例如。我有一个功能如下:-

int* function(int data)
{
    int a[50];
    int k = 0;
    a[k] = data;
    k++;
    // I want to make choice generalized so that it can accept both type of
    // values int as well as char.
    cout<<"n Enter integer element to insert into array, otherwise press 'n' to terminate array list: ";
    cin>>choice;
    if(choice != 'n')
        function(choice);
    return a;
}

所以,在上面的例子中,我想使选择广义化。我如何为函数和类使用模板,但是,我想为变量这样做。请帮忙。

注意:上面的代码只是一个例子来说明我的问题。

谢谢。

模板是一个编译时构造,因此无法让用户输入对模板类型产生影响。

您可以做的是一些基于模板的输入转换自动化,在这里您可以决定应该检查哪些模板实例化。假设您有一个名为GenericInput的类来处理输入转换,该类具有模板函数bool GenericInput::CanConvert<TargetType>()TargetType GenericInput::Convert<TargetType>()

GenericInput in;
std::cin >> in;
if (in.CanConvert<int>()) {
    // some action
}
else if (in.CanConvert<char>()) {
    // another action
}
// ...

它基本上是一个包装器,用于首先读取字符串,然后检查如何解释字符串。

要实现它,您需要以下内容:

过载operator >>

std::istream& operator >>(std::istream& stream, GenericInput& element) {
    /* TODO: read input into string member of GenericInput object */
    return stream;
}

GenericInput

class GenericInput {
private:
    std::string _inputElement; // store input as base for conversion
public:
    // TODO: standard class implementation
    template <typename TargetType>
    bool CanConvert() {
        // TODO: create std::stringstream from _inputElement and try to read into a TargetType variable
        // return true if the stringstream is valid after the read
    }
    template <typename TargetType>
    TargetType Convert() {
        // TODO: create std::stringstream from _inputElement and try to read into a TargetType variable
        // return variable if the stringstream is valid after the read, otherwise report error
    }
}

关于读取后的"有效"字符串流,检查两件事可能很重要:如果字符串流处于某种错误状态,则转换失败。如果字符串流中有未读字符,则表示转换不完整,这也可能算作失败。

请不要指望这是开箱即用的,它更多的是一个想法,而不是一个实际的实现。