在c ++中使用模板 - 从方法返回值

时间:2013-09-18 16:43:19

标签: c++ templates

我想要一个接收泛型类型和泛型类型(在运行时定义)的方法。在示例中,如果我使用的是字符串类型,则需要返回第一个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' 有人知道什么是错的吗? 感谢

4 个答案:

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

问题是,即使函数的返回类型为ifint的then子句也会返回一个字符串。 then-clause永远不会执行,因为typeif(valueOne)不可能是字符串这一事实并不重要,因为类型检查器并不关心它。他所看到的只是一个返回字符串的return语句,所以这是一个错误。

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