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

2 次関数として本当に必要で、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 に答える