我想编写一个调用多个子函数的函数,并返回这些子函数的结果。
sub functions:
template<class A> A sub1(A a)
template<class B> B sub2(B b, int i)
template<class C> C sub3(C c, string p)
该函数将在switch语句中相应地调用这些函数。 对不起我只有伪代码,因为我对这个问题感到困惑而没有开始编写代码。
mf(string s)
{
int k;
k = process(s)
string
switch (k){
case 0:
return sub1(k);
case 1:
return sub2(s, k);
case 2:
return sub3(k, s);
default:
break;
}
}
如何定义上面的mf,因为现在没有返回类型?再次使用模板? 顺便说一句,我的c ++编译器确实支持我不太熟悉的c ++ 11标准。
答案 0 :(得分:2)
如果您需要一个返回其子函数值的函数,则需要为所有函数提供相同的返回类型。
这里有一个毫无意义的例子:
double calculatedPositive(double value)
{
// Do stuff
}
double calculatedNegative(double value)
{
// Do stuff
}
double functionA(double value)
{
if(value > 0)
return calculatePositive(value);
else
return calculateNegative(value);
}
P.-S。如果您说出您想要实现的目标,我们可以为您提供更好的答案;)
答案 1 :(得分:2)
C ++基本上是一种静态类型语言,这意味着所有类型的表达式都是在编译时而不是在运行时决定的。
可以在静态类型语言中使用动态类型,但不建议广泛使用。因为这样做你几乎放弃了语言提供的所有多态性功能。您必须手动检查类型,或实现自己的基于动态类型的多态性。
如果返回的数据不是太复杂,标记结构通常是个好主意:
struct Value
{
enum {INT, FLOAT, PTR} type;
union
{
int int_data;
float float_data;
void *ptr_data;
};
};
对于需要支持大量操作的更复杂的数据类型,您应该考虑使用抽象接口和继承。
如果您认真考虑了这个问题,并且认为上述方法都不适用于您的问题,并且动态类型是最佳方式,则可以选择以下方法:
boost::any
- 适用于所有类型的唯一容器。需要测试类型并在使用前手动转换它们。
boost::variant
- 类似联合的容器,通过boost::static_visitor
支持一元多态操作。
有些编程框架对动态类型有自己的支持。一个例子是Qt中的QVariant
。如果您处于这样的框架中,通常建议使用它们而不是其他库中的其他内容。