2012-10-07 176 views
0

我想写一个函数调用几个子函数并返回这些子函数的结果。如何写一个函数返回一个返回类型的子函数

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

如果他们只是简单的功能,为什么你需要使用模板?好像矫枉过正我 – FaddishWorm

+1

您可以返回[Boost.Variant(http://www.boost.org/doc/html/variant.html),这将让你返回不同类型,甚至一个空类型,请打破的情况下(使用'升压:: empty'作为类型之一。 – Xeo

回答

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。如果你在这样的框架中,通常建议使用它们而不是其他库中的其他东西。

+0

谢谢你的回复。就像我上面写的一样,我想在C++中为SCHEME编写一个解释器,其中表达式将被计算为一个值。该值可以是数字,字符串,列表等,只能在评估之后清除。 – user1461328

+0

@ user1461328:在方案中只有一些基本类型,所以我宁愿使用boost :: any标签。 :-) – hpsMouse

+0

@ user1461328:boost :: any确实提供了一个type()函数,因此该标记不是必需的。对不起,我错了。答案已被纠正。 – hpsMouse

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.我们可以为您提供更好的答案,如果你说你正在努力实现的目标;)

+0

实际上欲写在C++方案,其中表达将被评估的值由另一个表达式中使用的解释器。 – user1461328