我想编写一个函数,调用多个子函数并返回这些子函数的结果。
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/