我想要一个接收泛型类型和泛型类型(在运行时定义)的方法。在示例中,如果我使用的是字符串类型,则需要返回第一个param lenght(以字符串形式);如果我使用的是int类型,则需要返回最大的(整数)。
看看:
#include "stdafx.h"
#include <sstream>
#include <iostream>
#include <conio.h>
#include <sstream>
#include <string>
#include <atldbcli.h>
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
using namespace std;
class Test
{
public:
template<class T>
T returnVal(T valueOne, T valueTwo);
};
template<class T>
T Test::returnVal(T valueOne, T valueTwo)
{
if(typeid(valueOne) == typeid(string))
{
string teste = valueOne;
int testeInt = teste.size();
ostringstream testeString;
testeString << testeInt;
teste = testeString.str();
return teste;
}
else
return valueOne > valueTwo? valueOne:valueTwo;
}
int main()
{
string reference = "stringVal";
Test ref;
cout << ref.returnVal<string>(reference, "asasas") << endl;
cout << ref.returnVal<int>(10, 485);
getch();
return 0;
}
但是,当主函数调用 ref.returnVal(10,485); 时,它会显示一条消息错误:'return':无法从'std :: string'转换为' INT' 有人知道什么是错的吗? 感谢
答案 0 :(得分:1)
这不是做你想做的事的正确方法。您不能使用typeid在类型之间切换并执行不同的操作,因为仍然必须编译所有不同的路径,并且在您的方法返回int时返回字符串。
谷歌模板专业化,这就是你需要我猜...
答案 1 :(得分:1)
#include <string>
template <class T>
int returnVal(T valueOne, T valueTwo);
template <>
int returnVal<std::string>(std::string valueOne, std::string valueTwo)
{
return (int)valueOne.length();
}
template <>
int returnVal<int>(int valueOne, int valueTwo)
{
return std::max(valueOne, valueTwo);
}
int main()
{
int x = returnVal(std::string("Hello"), std::string("World!"));
int y = returnVal(1,2);
return 0;
}
除非我误解你,否则你可以通过模板专业化实现这个目标吗?
答案 2 :(得分:1)
之前的所有答案都清楚地确定了问题。至于更好的方法:
class Test
{
public:
string returnVal(string valueOne, string valueTwo)
{
string teste = valueOne;
int testeInt = teste.size();
ostringstream testeString;
testeString << testeInt;
teste = testeString.str();
return teste;
}
int returnVal(int valueOne, int valueTwo)
{
return valueOne > valueTwo? valueOne:valueTwo;
}
};
答案 3 :(得分:0)
如果您为类型int
实例化模板,它看起来像这样:
int Test::returnVal(int valueOne, int valueTwo)
{
if(typeid(valueOne) == typeid(string)) // This will be false
{
string teste = valueOne;
int testeInt = teste.size();
ostringstream testeString;
testeString << testeInt;
teste = testeString.str();
return teste;
}
else
return valueOne > valueTwo? valueOne:valueTwo;
}
问题是,即使函数的返回类型为if
,int
的then子句也会返回一个字符串。 then-clause永远不会执行,因为typeif(valueOne)
不可能是字符串这一事实并不重要,因为类型检查器并不关心它。他所看到的只是一个返回字符串的return语句,所以这是一个错误。
要做你想做的事,你应该简单地重写字符串的函数,并从模板化函数中删除所有特定于字符串的代码。