2012-10-23 9 views
1

我在Windows中工作,我想通過netbeans創建我的程序,所以我需要通過cygwin使用linux編譯器。到現在爲止我已經能夠使用的int小號文字陣列像這樣:Visual C++數組文字

int x[6] = {1, 2, 3, 4, 5, 6} 

或方法

methodName({1, 2, 3, 4, 5, 6}) 

我最近改變到Visual Studio,但我不允許這樣做。有其他選擇嗎?

+2

INT X [6] = {1,2,3, 4,5,6};正常工作 – harper

+0

'methodName'的聲明是什麼?唯一有意義的方法是如果參數是'int const(&)[6]'(或者這個的模板版本),甚至只有C++ 11。 –

+0

@CerrekSB在C++ 11中,可以調用一個函數,它使用一個向量,一個std :: array或使用該語法的很多東西。 – bames53

回答

0
int x[6] = {1, 2, 3, 4, 5, 6} 

這種語法已經被MSVC2010

methodName({1, 2, 3, 4, 5, 6}) 

supprted但是,這不支持。如上所述,只有「int const(&)[6]」函數參數纔有意義。

這一翻譯則可以使用以下語法:

methodName(make_array(1,2,3,4,5,6)); 

Example implementation

#include <iostream> 
#include <ostream> 

using namespace std; 


template<typename T,unsigned size> 
struct Array 
{ 
    typedef T type[size]; 
    mutable type data; 
    Array() 
    { 
     cout << "Array::Array" << endl; 
    } 
    ~Array() 
    { 
     cout << "Array::~Array" << endl; 
    } 
}; 

template<typename T> inline 
typename Array<T,1>::type &make_array(const T &p1,const Array<T,1> &aux=Array<T,1>()) 
{ 
    aux.data[0]=p1; 
    return aux.data; 
} 

template<typename T> inline 
typename Array<T,2>::type &make_array(const T &p1,const T &p2,const Array<T,2> &aux=Array<T,2>()) 
{ 
    aux.data[0]=p1; 
    aux.data[1]=p2; 
    return aux.data; 
} 

template<typename T> inline 
typename Array<T,3>::type &make_array(const T &p1,const T &p2,const T &p3,const Array<T,3> &aux=Array<T,3>()) 
{ 
    aux.data[0]=p1; 
    aux.data[1]=p2; 
    aux.data[2]=p3; 
    return aux.data; 
} 

// ... 

void test_array(int (&p)[3]) 
{ 
    cout << p[0] << " " << p[1] << " " << p[2] << endl; 
} 

void test_ptr(int *p) 
{ 
    cout << p[0] << " " << p[1] << " " << p[2] << endl; 
} 

int main(int argc,char *argv[]) 
{ 
    test_array(make_array(33,22,11)); 
    test_ptr(make_array(33,22,11)); 
    return 0; 
} 

或者,with help of Boost.Preprocessor

#include <iostream> 
#include <ostream> 
using namespace std; 

// ______________________________________________________________ 

template<typename T,unsigned size> 
struct Array 
{ 
    typedef T type[size]; 
    mutable type values; 
    Array() 
    { 
     cout << "Array::Array" << endl; 
    } 
    ~Array() 
    { 
     cout << "Array::~Array" << endl; 
    } 
}; 

#include <boost/preprocessor/iteration/local.hpp> 
#include <boost/preprocessor/repetition/enum.hpp> 
#include <boost/preprocessor/repetition/repeat.hpp> 

#define MAKE_ARRAY_PP_MAX_ARG_COUNT 16 

#define MAKE_ARRAY_PP_PARAM_LIST(z, n, data) const T & BOOST_PP_CAT(p, n) 
#define MAKE_ARRAY_PP_PARAM_ASSIGN(z, n, data) aux.values[n] = BOOST_PP_CAT(p, n); 

#define BOOST_PP_LOCAL_MACRO(n) \ 
template<typename T> inline \ 
typename Array<T,n>::type &make_array(BOOST_PP_ENUM(n, MAKE_ARRAY_PP_PARAM_LIST, _) , const Array<T,n> &aux=Array<T,n>()) \ 
{ \ 
    BOOST_PP_REPEAT(n, MAKE_ARRAY_PP_PARAM_ASSIGN, _) \ 
    return aux.values; \ 
} \ 
/**/ 
#define BOOST_PP_LOCAL_LIMITS (1, MAKE_ARRAY_PP_MAX_ARG_COUNT) 
#include BOOST_PP_LOCAL_ITERATE() 

// ______________________________________________________________ 

void test_array(int (&p)[3]) 
{ 
    cout << p[0] << " " << p[1] << " " << p[2] << endl; 
} 

void test_ptr(int *p) 
{ 
    cout << p[0] << " " << p[1] << " " << p[2] << endl; 
} 

int main(int argc,char *argv[]) 
{ 
    test_array(make_array(33,22,11)); 
    test_ptr(make_array(33,22,11)); 
    make_array(33,22,11,00,55,44,66); 
    make_array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); 
    return 0; 
}