在模板函数中使用C ++ RTTI,aCC编译器给出编译错误

时间:2011-12-08 08:23:39

标签: c++ templates rtti

代码如下:

#include<iostream>
#include<string>
#include<occi.h>
using namespace std; using namespace oracle::occi;

template<class T> void print(T  val) {
    if (typeid(val).name()==typeid((int)1).name())
    {
        val+=2;
    }
    else if (typeid(val).name()==typeid((string())).name())
    {
        val+="string";
    }
    cout<<val<<endl; }

int main() {
    int a=100;
    string str="abcdef";
    print(str);     
    print(a);
    return 0; 
}

aCC编译器的错误消息如下:

aCC -AA  +DD64 -mt   -g -D_DEBUG_ -I/oracle/app1/oracle/product/9.2/rdbms/demo  -I/oracle/app1/oracle/product/9.2/rdbms/public -I/oracle/app1/oracle/product/9.2/plsql/public  -I/oracle/app1/oracle/product/9.2/network/public   -c test4.cpp
Error 203: "test4.cpp", line 16 # Cannot assign 'int' with 'const char *'.

            val+="string";
            ^^^^^^^^

Error 445: "test4.cpp", line 21 # Cannot recover from earlier errors.
    int main()
    ^^^^^^^^^^
*** Error exit code 2

Stop.

3 个答案:

答案 0 :(得分:2)

您应该使用模板专业化来实现这一目标:

/* template declaration - no definition (you can add a definition as default
   for unknown types if you want)
 */
template<class T> void print(T  val);

// This will be used if the parameter is of type int
template<>
void print<int>(int val) {
    val += 2;
    cout << val << endl;
}

// This will be used if the parameter is of type string
template<>
void print<std::string>(std::string val) {\
    val += "string";
    cout << val << endl;
}

或者,您可以为要处理的每种类型编写重载:

// This will be used if the parameter is of type int
void print(int val) {
    val += 2;
    cout << val << endl;
}

// This will be used if the parameter is of type string
void print(std::string val) {\
    val += "string";
    cout << val << endl;
}

模板方法提供的优势是,您可以定义一个默认实现,该实现处理您尚未手动编写实现的所有类型。如果您不需要,过载方法更简单,更安全。

答案 1 :(得分:1)

解决方案是封装函数中依赖于其自身函数中的数据类型的部分。这样,您就可以为需要以特定方式处理的每种类型提供重载:

template <typename T>
void print(T val) 
{
    doPrint(val);
    std::cout << val << std::endl;
}

// default case
template <typename T>
void doPrint(T & val)
{}

// int case
void doPrint(int & val)
{
    val += 2;
}

// string case
void doPrint(std::string & val)
{
    val += "string";
}

int main()
{
    print(42);                 // outputs 44
    print(std::string("foo")); // outputs foostring
    print(12.);                // outputs 12
    print("bar");              // outputs bar
}

答案 2 :(得分:0)

为您尝试传入的每种类型创建print实现。由于类比检查,此代码违反了KISS原则。