struct G{
G&operator()(const int**a)
{
v<<a;
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout, " "));
return *this;
}
friend std::vector<int>&operator<<(std::vector<int>&v,const int** n);
std::vector<int>v;
};
std::vector<int>&operator<<(std::vector<int>&v,const int** n)
{
v.insert(v.begin(),*n,*n+sizeof(*n)/sizeof(*n[0]));
return v;
}
/// use it
G g;
int v[8]={1,2,3,4,5,6,5,4};
g(&v);
我有两个问题,
1.上面的代码返回错误cannot convert parameter 1 from 'int (*)[8]' to 'const int **'
我想用g({1,2,3,4,5,6,5,4})而不是g(&amp; v)来传递g。但我不知道该怎么做,总是想知道g是否会接受它
谢谢。
答案 0 :(得分:1)
如果您知道将始终使用大小为8的常量数组
struct G{
G&operator()(int a[8])
{
v.reserve(8);
v.insert(v.begin(), a, a + 8);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout, " "));
return *this;
}
std::vector<int>v;
};
/// use it
G g;
int v[8]={1,2,3,4,5,6,5,4};
g(v);
如果没有,您需要将数组的大小与数组一起传递:
struct G{
G&operator()(int* a, int len)
{
v.reserve(len);
v.insert(v.begin(), a, a + len);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout, " "));
return *this;
}
std::vector<int>v;
};
/// use it
G g;
int v[8]={1,2,3,4,5,6,5,4};
g(v, sizeof(v) / sizeof(int));
或者,如果您总是要使用编译时数组(来自声明它们的范围)而不是动态数组,
struct G{
template<unsigned int Len>
G& operator()(int (&a)[Len])
{
v.reserve(Len);
v.insert(v.begin(), a, a + Len);
std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout, " "));
return *this;
}
std::vector<int>v;
};
/// use it
G g;
int v[]={1,2,3,4,5,6,5,4};
g(v);
但请注意,最后一个版本会为您传递的每个不同大小的数组生成不同版本的operator()
。
答案 1 :(得分:0)
&v
会为您提供数组的地址。尝试const int* x = v
然后g(&x)
。在C ++ 0x中,您可以这样做:
G& operator()(std::initializer_list<const int>);
g({1,2,3,4,5,6,5,4});