如何编写一个返回一个类型的函数,该类型是其子函数的返回类型

时间:2012-10-07 03:18:53

标签: c++

我想编写一个调用多个子函数的函数,并返回这些子函数的结果。

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标准。

2 个答案:

答案 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。如果您处于这样的框架中,通常建议使用它们而不是其他库中的其他内容。