2013-02-11 76 views
1

我一直在编写C++一段时间(Java/C很长一段时间),我想知道是否有一个技巧,我不'知道哪些可以帮助我做到以下几点。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; 
} 

但我不认为我会打扰.. 。

+2

'std :: vector'有什么问题? – us2012 2013-02-11 22:45:22

+0

在实际代码中没有任何东西:)这个类扩展了std :: vector,增加了打印方法和构造 – 2013-02-11 22:46:45

+1

“打印方法”的便捷函数听起来不像扩展vector类的工作,更像是你应该使用非 - 成员的功能。 – us2012 2013-02-11 22:48:22

回答

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

+0

我会试试这个,谢谢。正如我所说的,我无法访问C++ 11。而我并不想使用Boost(相反,它并不能在我的平台上使用)。 – 2013-02-11 22:49:13

+0

从std :: vector公开继承有什么问题? – 2013-02-11 22:51:53

+0

@WayneUroda它不是为此设计的。它没有虚拟析构函数,这意味着如果从基指针删除派生类型的对象,则会得到未定义的行为。 – juanchopanza 2013-02-11 22:54:57