基本上,如果我有这个:
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,但很难将其应用到我的场景中。任何帮助或指向正确的方向都会很棒。
答案 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);