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()例如,@T.C.这在只使用int/bool的情况下是有效的,但是如果我想有更多的返回类型呢?如前所述,这看起来是非常糟糕的设计。但这可能是因为您在示例中过于简化了问题。如果您知道在编译时返回的类型,为什么要创建一个方法,其switch语句的唯一目的似乎是选择正确的返回该类型的“内部方法”?为什么不使用不同的方法呢?调用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;
}
}