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

How to transform a list of parameter in an array

本文关键字:参数 列表 数组 何转换 转换      更新时间:2023-10-16

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

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

如果您确实希望将其作为辅助函数并且不使用 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

你为什么要重新发明轮子?C++已经有了预先构建的容器,这些容器确实希望您正在尝试。如果需要动态大小的数组,请使用 std::vector 。如果需要固定大小的数组,请使用 std::array 。这些是您应该考虑的替代方案。