将参数作为整数数组传递

时间:2011-08-27 00:56:30

标签: c++

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是否会接受它 谢谢。

2 个答案:

答案 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)

    当您需要指针的地址时,
  1. &v会为您提供数组的地址。尝试const int* x = v然后g(&x)
  2. 在C ++ 0x中,您可以这样做:

    G& operator()(std::initializer_list<const int>);
    g({1,2,3,4,5,6,5,4});