Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板返回具有相同参数的不同类型_C++_Templates - Fatal编程技术网

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

C++ C++;模板返回具有相同参数的不同类型,c++,templates,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;

基本上,如果我有这个:

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

我看到了,但很难将其应用到我的场景中。任何帮助或指向正确的方向都是非常好的

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);
模板
无效Foo(整数x、T和arg1)
{
如果(x==0)
arg1=真;
else如果(x==1)
arg1=“测试”;
}
布尔a=假;
std::字符串b;
Foo(0,a);
Foo(1,b);

这里的想法是使用可转换为我们所需的退货类型的退货类型。 在这种情况下,我们可以使用可以转换为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进行类型转换,如所述

在您的情况下,如果您只想使用int和bool。因为int可以转换为bool,所以您可以只返回int。使用1和0代替返回“true”和“false”

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

如前所述,只需返回一个
int
。隐式转换到
bool
将做正确的事情。另外,您可能希望在
default
的情况下使用一些东西,而不是在函数末尾调用未定义的行为-可能会抛出一个异常。您传递给
Foo
的值在编译时已知吗?您可以执行
intx=Foo()intx=Foo(3)时应该发生什么?另外,如果需要多个参数,可以使用可变模板(c++11特性)。
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;
}
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 Foo(int x)
{
    switch (x)
    {
        case 0:
            return 1;
            break;
        case 1:
            return 0;
            break;
        case 2:
            return 100;
            break;
        default:
            break;
    }
}