如何转换数组中的参数列表

时间:2013-01-28 00:25:53

标签: c++

我想将相同类型的参数列表转换为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)).

太可怕了。有没有人有更好的解决方案?

2 个答案:

答案 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。这些是您应该考虑的替代方案。