如何为特定模板数据类型创建条件

时间:2016-07-28 21:27:32

标签: c++ templates stack

所以我制作了一个非常简单的堆栈,工作得很好并决定将其转换为模板,它也工作正常,但是当我把它变成整数时输入的东西

string m;
    getline(cin, m);
    linkedliststack<int> str;
    for (int i = 0; i < m.length(); i++)
    {
        str.push(m[i]);
    }

似乎通过使用这种输入方法,m [i]变为char转为int,换句话说转为ASCII码,所以如果我输入1则给出48,2给49等。 简单的解决方案当然就是这个。

str.push(m[i]-48)

但有没有办法让它自动化,e.i。如果条件或任何东西? 如果是,那么所需的语法是什么?

感谢。

3 个答案:

答案 0 :(得分:0)

字符串push_back是

void push_back (char c);

即。需要char。如果您希望将值设为char,则必须使用例如unsigned char进行转换。 itoa等。

答案 1 :(得分:0)

我必须为重复这个问题道歉,因为它与How do I get the type of a variable?上的问题有关 对不起,这是我第一次提问。

所以要解决这个问题,我在课堂上做了一个新功能

string type(){ return  typeid(head->value).name(); } 

并且新条件解决了这个问题。

if (str.type()== "int")

答案 2 :(得分:0)

如果您能够使用C ++ 14,那么可能会有一个enable_if解决方案。  甚至可能是SFINAE解决方案。但是,我对此并不十分熟悉。

我假设您的推送方法被声明为

void push(typename T);

然后您正在做的是将char (m[i])隐式转换为int str.push(m[i]);

您可以提供一个重载的模板方法,该方法可以处理char输入并将其正确转换为您的typename。

这样的事情:

void push(const char input)
{
    push(atoi(input));
    // push(input-48);
}

但是可能需要考虑很多错误: 如果atoi()无法将char转换为整数会发生什么? 在-48的情况下,如果输入是非数字字符,您将在堆栈上推送非预期的数字。 如果模板未实例化,将会发生什么。