0

我想要一个接收泛型类型和泛型类型(在运行时定义)的方法。在示例中,如果我使用的是字符串类型,它需要返回第一个参数长度(在字符串中);如果我使用的是 int 类型,则需要返回最大的(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' 有人知道出了什么问题吗?谢谢

4

4 回答 4

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;
}

除非我误解了你,否则你可以通过模板专业化来实现这一点?

于 2013-09-18T17:06:15.803 回答
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;
    }
};
于 2013-09-18T17:07:48.290 回答
1

这不是做你想做的事情的正确方法。您不能使用 typeid 在类型之间切换并执行不同的操作,因为仍然必须编译所有不同的路径,并且在您的内部,如果您确实返回一个字符串,而您的方法返回一个 int。

谷歌模板专业化,这就是你需要的我猜......

于 2013-09-18T16:48:43.503 回答
0

如果你为 type 实例化你的模板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问题是即使函数的返回类型是,您的 then 子句也会返回一个字符串int。then 子句永远不会执行,因为typeif(valueOne)不可能是字符串这一事实并不重要,因为类型检查器并不关心这一点。他所看到的只是一个返回字符串的 return 语句,所以这是一个错误。

要做你想做的,你应该简单地为字符串重载你的函数,并从模板函数中删除所有特定于字符串的代码。

于 2013-09-18T16:53:08.600 回答