#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.
答案 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原则。