如何使用模板在c ++中进行变量推广?

时间:2015-12-02 12:54:51

标签: c++

我试图从用户那里获取输入,并且用户有多种选择来输入不同类型的输入(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;
}

所以,在上面的例子中,我想做出选择。我如何使用模板的功能和类,但我想为变量做这个。请帮忙。

注意:上面的代码只是举例说明我的问题。

感谢&#39; S

1 个答案:

答案 0 :(得分:0)

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

您可以做的是输入转换的一些基于模板的自动化,您可以决定应该检查哪些模板实例化。假设您有一个类来处理名为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
    }
}

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

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