1

私はしばらくの間C++を書いています(長い間java / C)、私が次のことをするのを助けることができる私が知らないトリックがあるかどうか疑問に思います。

vector<unsigned char> *fromArray(unsigned char data[], int length)
{
    vector<unsigned char> *ret = new vector<unsigned char >();
    while (length--)
    {
        ret->push_back(*data);
    }
    return ret;
}

そして、あなたはそれを次のように使うことができます:

unsigned char tmp[] = {0, 1, 2, 3, 4, 5};
vector<unsigned char> *a = fromArray(tmp, sizeof(tmp));
// use `a' here

かなり面倒だと思います。すべてを1行で書きたいと思います。

vector<unsigned char> *a = fromArray({0, 1, 2, 3, 4, 5});
// use `a' here

そのようなことは可能ですか?残念ながら、C ++ 11にアクセスできません(そのinitializer_listがまさに私が望むもののようです)。

編集

申し訳ありませんが、ここでいくつかの基本が間違っていました。std::vectorの拡張は避けます。しかし、私の例が悪い例だったというだけで、質問はまだ有効だと思います。

**潜在的な回避策**

オーバーロードされた関数の束を定義して、さまざまな数の引数を取ることができます。

vector<unsigned char> *fromArray(unsigned char a)
{
    vector<unsigned char> *ret = new vector<unsigned char >();
    ret->push_back(a);
    return ret;
}

vector<unsigned char> *fromArray(unsigned char a, unsigned char b)
{
    vector<unsigned char> *ret = new vector<unsigned char >();
    ret->push_back(a);
    ret->push_back(b);
    return ret;
}

しかし、私は気にしないと思います...

4

1 に答える 1

1

テンプレートを使用して、任意の固定サイズ配列のサイズを推測できます。

template< class T, size_t N >
auto_ptr<ByteArray> foo( T (&data)[N] )
{
  return auto_ptr<ByteArray>(new ByteArray(data, N));
}

それから

unsigned char tmp[] = {0, 1, 2, 3, 4, 5};
auto_ptr<ByteArray> a = foo(tmp);

ただし、これauto_ptrは非推奨であることに注意してください。優先しunique_ptrます。また、から公に継承するべきではないことに注意してくださいstd::vector

于 2013-02-11T22:46:56.377 に答える