C ++模板返回具有相同参数的不同类型

时间:2014-12-12 05:25:11

标签: c++ templates

基本上,如果我有这个:

template <class T> 
inline T Foo(int x)
{
    switch (x)
    {
        case 0:
            return true;
            break;
        case 1:
            return false;
            break;
        case 2:
            return 100;
            break;
        default:
            break;
    }
}

然后我必须这样使用它:

int x = Foo<int>(2);
bool b = Foo<bool>(0);

如果可能的话,我更愿意这样做:

int x = Foo(2);
bool b = Foo(0);

我看到了this question,但很难将其应用到我的场景中。任何帮助或指向正确的方向都会很棒。

2 个答案:

答案 0 :(得分:1)

这里的想法是使用可转换为我们所需返回类型的返回类型。 在这种情况下,我们可以使用string,它可以转换为int,bool,double等。使用stringstream。

inline polyType Foo(int x)
{
    polyType result;
    switch (x)
    {
        case 0:
            result.value = "0";
            break;
        case 1:
            result.value = "1";
            break;
        case 2:
            result.value = "100";
            break;
        case 3:
            result.value = "awesome";
            break;
        case 4:
            result.value = "10.22";
            break;
        default:
            break;
    }
    return result;
}

其中polyType将声明为以下类型,其类型为任何类型名称T转换为here

struct polyType {
    string value;

    template <typename T>
    operator T() const
    {
       stringstream ss(value);
       T convertedValue;
       if ( ss >> convertedValue ) return convertedValue;
       else throw runtime_error("conversion failed");
    }
 };

现在您可以将其用作

int a = Foo(2);
bool b = Foo(0);
float c = Foo(4);

在您的情况下,如果您只想使用int和bool。因为int可以转换为bool,所以你可以返回int。而不是返回&#34; true&#34;和&#34;假&#34;使用1和0。

int Foo(int x)
{
    switch (x)
    {
        case 0:
            return 1;
            break;
        case 1:
            return 0;
            break;
        case 2:
            return 100;
            break;
        default:
            break;
    }
}

答案 1 :(得分:0)

AFAIK编译器不能仅基于返回类型隐式确定模板参数。如果将它们作为参数(函数模板)传递,它通常可以隐式地确定它们。

因此,可能更好的一件事是通过引用传递模板参数:

template <typename T>
void Foo(int x, T& arg1)
{
    if (x == 0)
        arg1 = true;
    else if (x == 1)
        arg1 = "test";  
}

bool a = false;
std::string b;

Foo(0, a);
Foo(1, b);