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

我觉得这很麻烦 - 我想把它全部写在一行上

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 回答