c++ - 如何编写一个返回其子函数返回类型的函数

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

最佳答案

C++ 基本上是一种静态类型语言,这意味着所有类型的表达式都是在编译时而不是运行时决定的。

在静态类型语言中使用动态类型是可能的,但不建议广泛使用。因为这样做您将放弃该语言提供的几乎所有多态性功能。您必须手动检查类型,或者实现您自己的基于动态类型的多态性。

如果返回的数据不太复杂,标记结构通常是一个好主意:

struct Value
{
    enum {INT, FLOAT, PTR} type;
    union
    {
        int   int_data;
        float float_data;
        void *ptr_data;
    };
};

对于需要支持大量操作的更复杂的数据类型,您应该考虑使用抽象接口(interface)和继承。

如果您认真考虑了该问题,并且认为上述方法均不适用于您的问题,并且动态类型是最好的方法,那么这里有一些选项:

  • boost::any -- 所有类型的唯一容器。使用前需要测试类型并手动转换。

  • boost::variant -- 类似 union 的容器,通过 boost::static_visitor 支持一元多态操作。

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

关于c++ - 如何编写一个返回其子函数返回类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12765855/

相关文章:

c++ - 终止所有子进程后无法运行父进程。

Java/C/C++/C#/PHP 到 Pascal 转换器?

c++ - qt 应用程序未运行

c++ - 如何初始化一个以priority_queue为值的map与priority_queue的比较对象?

c++ - 如何在 C++ 中压缩相对文件名

c# - 在 Visual Studio 中识别 .tcc 文件?

运行时的 C++ lambda 实现

c++ - 每行从文件行中读取一个字符串,只读取第一个单词

c++ - arduino 低 i2c 读取速度;

c++ - Mac 上的 Qt::Sheet 和 QMessageBox::show()