1

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

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

4

2 回答 2

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

于 2013-01-28T00:35:39.837 回答
0

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

于 2013-01-28T00:39:22.433 回答