使用带模板的typeid

时间:2013-11-09 09:56:26

标签: c++ string templates

template<class T>
inline T Library<T>::get_isbn()
{
    T temp;
    cout << "Enter the name/no:" << endl;
    cin >> temp;
    string ka;
    if (typeid(temp) == typeid(ka))
    {
        while (islower(temp[0]))
        {
            cout << " Pls enter the using the first letter as capital" << endl;
            cin >> temp;
        }
    }
}
return temp;
}

我正在创建一个模板类,它可以使用整数或string作为模板参数,当我使用T作为string创建类的对象时,它会进入循环,一切都很好。但是当我创建一个以int作为模板参数的对象时,它会给我两个错误:

  

错误C1903:无法从先前的错误中恢复;停止   汇编

     

错误C2228:'。at'的左边必须有class / struct / union

我希望如果传递的参数是string,那么只有用于检查第一个字母表为大写的代码才能运行,否则当我将模板参数设为int时,它不应该检查对于第一个字母表的事情。

1 个答案:

答案 0 :(得分:3)

C ++中的if总是(语义上)是运行时决策。编译时编译器可以 进行评估,丢弃未使用的分支。但它可能并不意味着必须。您仍然必须确保所有分支都包含有效代码。

在此示例中,如果temp[0]是整数,则表达式temp格式不正确。最简单的解决方案是在泛型函数中调用重载函数 - 注意:通过引入typeid - 分支,您的算法本身不再是通用的,它需要对某些类型进行特殊处理。

template<class T>
void get_isbn_impl(T&)
{
    // default implementation
}

void get_isbn_impl(string& str)
{
    // special version for `string`
    while (islower(str[0]))
    {
        cout << " Pls enter the using the first letter as capital" << endl;
        cin >> str;
    }
}

template<class T>
inline T Library<T>::get_isbn()
{
    T temp;
    cout << "Enter the name/no:" << endl;
    cin >> temp;

    get_isbn_impl(temp);

    return temp;
}

也可以专注于Library<string>(全班)或Library<string>::get_isbn