3

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

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

4

2 回答 2

3

如果您需要一个返回其子函数值的函数,则所有这些函数都需要相同的返回类型。

这是一个没有意义的小例子:

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。如果您说出您想要达到的目标,我们可以为您提供更好的答案;)

于 2012-10-07T03:28:53.543 回答
3

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.

  • 一些编程框架有自己的动态类型支持。一个例子是QVariant在 Qt 中。如果您在这样的框架中,通常建议使用它们而不是其他库中的其他东西。

于 2012-10-07T04:57:30.087 回答