/*
* File: main.cpp
* Author: Administrator
*
*/
// Java 中可以使用Object[] 方式用于返回多个值的函数,因为Java可以使用Object[] objs = fun()的方式接收,
// 最重要的是,objs的长度在Java程序中是可知的,而如果C++中却不行!
// public static Object[] fun() {
// return new Object[]{1, 'c', 3.14,new Object()};
// }
// JAVA 与 C++ 都可以通过自定义类的方式解决上述问题,而C++在使用模版及特化要比Java自定义类强大和方便!
namespace cn_vicky {
/**定义最多返回5个参数的tuple模版类*/
template <typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void>
struct tuple {
tuple() {
}
tuple(T1 _v1, T2 _v2, T3 _v3, T4 _v4, T5 _v5) : v1(_v1), v2(_v2), v3(_v3), v4(_v4), v5(_v5) {
}
T1 v1;
T2 v2;
T3 v3;
T4 v4;
T5 v5;
};
/**特化返回4个*/
template <typename T1, typename T2, typename T3, typename T4>
struct tuple<T1, T2, T3, T4, void> {
tuple() {
}
tuple(T1 _v1, T2 _v2, T3 _v3, T4 _v4) : v1(_v1), v2(_v2), v3(_v3), v4(_v4) {
}
T1 v1;
T2 v2;
T3 v3;
T4 v4;
};
/**特化返回3个*/
template <typename T1, typename T2, typename T3>
struct tuple<T1, T2, T3, void, void> {
tuple() {
}
tuple(T1 _v1, T2 _v2, T3 _v3) : v1(_v1), v2(_v2), v3(_v3) {
}
T1 v1;
T2 v2;
T3 v3;
};
/**特化返回2个*/
template <typename T1, typename T2>
struct tuple<T1, T2, void, void, void> {
tuple() {
}
tuple(T1 _v1, T2 _v2) : v1(_v1), v2(_v2) {
}
T1 v1;
T2 v2;
};
/**特化返回1个*/
template <typename T1>
struct tuple<T1, void, void, void, void> {
tuple() {
}
tuple(T1 _v1) : v1(_v1) {
}
T1 v1;
};
/**特化返回0个*/
template <>
struct tuple<void, void, void, void, void> {
};
}
cn_vicky::tuple<int, int, int, int, int> fun5(void) {
return cn_vicky::tuple<int, int, int, int, int>(1, 2, 3, 4, 5);
}
cn_vicky::tuple<int, int, int, int> fun4(void) {
return cn_vicky::tuple<int, int, int, int>(1, 2, 3, 4);
}
cn_vicky::tuple<int, int, int> fun3(void) {
return cn_vicky::tuple<int, int, int>(1, 2, 3);
}
/*
*
*/
int main(void) {
cn_vicky::tuple<int, int, int, int, int> f5 = fun5();
cn_vicky::tuple<int, int, int, int> f4 = fun4();
cn_vicky::tuple<int, int, int> f3 = fun3();
return 0;
}
更相近的可以参阅boost库tuple的实现,以及如何使用宏的方式更灵活!