我想将相同类型的参数列表转换为C数组。 这是我找到解决问题的最佳方法:
template <typename T > class _Arr {
template <size_t N> struct Rep_base {
T m_el[N];
operator T * () { return m_el; }
};
public:
template <size_t N> struct Rep;
template <> struct Rep<1> : public Rep_base<1> {
Rep(const T & a) { m_el[0] = a; };
};
template <> struct Rep<2> : public Rep_base<2> {
Rep(const T & a, const T & b) { m_el[0] = a; m_el[1] = b;};
};
...
};
给定一个函数:
void f(int x[5]);
是否可以致电f(_Arr<int>::Rep<5>(1, 2, 3, 4, 5)).
太可怕了。有没有人有更好的解决方案?
答案 0 :(得分:1)
如果你真的想要它作为辅助功能并且不使用C ++ 11,你可以使用变量参数:
#include <iostream>
#include <stdarg.h>
#include <vector>
std::vector<int> var_func( int n, ... ) {
va_list ap;
va_start(ap, n);
std::vector<int> args;
for(int i = 0; i != n; ++i) {
args.push_back(va_arg(ap, int));
}
va_end(ap);
return args;
}
void f(int x[5]) {
for( int i = 0; i != 5; ++i ) std::cout << x[i];
}
int main() {
f( var_func(5, 1, 2, 3, 4, 5).data() );
return 0;
}
输出为12345
答案 1 :(得分:0)
你为什么要重新发明轮子? C ++已经有预先构建的容器,它们确实需要您尝试。如果需要动态大小的数组,请使用std::vector
。如果您想要固定大小的数组,请使用std::array
。这些是您应该考虑的替代方案。