在函数调用中声明数组

时间:2013-08-15 22:28:26

标签: c++ arrays visual-studio-2010

是的,我知道这在C ++ 0x / C ++ 11中是可行的,因此可以在Visual Studio 2012中完成。

但是,我正在运行Visual Studio 2010.我想知道是否可以做类似的事情:

void MyFunction(int myArray[])
{}

MyFunction({1,2,3});

没有必须事先声明阵列的不便。

在Visual Studio 2010使用的C ++版本中是否有解决方法?或者以某种方式更新Visual Studio 2010用于支持更多C ++ 11功能的编译器?或者我没有选择?

修改

感谢yzt,我已经能够通过Boost做到这一点!

这是一些示例代码,以防其他人碰巧在我的位置(我似乎无法使用普通数组,但std::vector(或实际上是另一个stl容器)等会做得很好!):

功能:

void TestFunction(std::vector<int> myArray)
{
    for(std::vector<int>::size_type i = 0; i < myArray.size(); ++i)
    {
        std::cout<<myArray[i]<<std::endl;
    }
}

致电:

TestFunction(boost::assign::list_of(1)(2)(3));

4 个答案:

答案 0 :(得分:2)

Visual C ++唯一支持此版本的版本是Visual C ++ 2013 Preview。

如果您真的设置了这样做,您可以定义一个vector_builder类,让您在一行中完成工作 - 只需几个附带条件:首先,它几乎 必须是一个向量而不是一个数组,其次,执行该工作的语法相当丑陋且反直觉(至关重要)我甚至毫不犹豫地提到它。

template<class T>
class make_vector {
    std::vector<T> data;
public:
    make_vector(T const &val) { 
        data.push_back(val);
    }

    make_vector<T> &operator,(T const &t) {
        data.push_back(t);
        return *this;
    }

    operator std::vector<T>() { return data; }
};

template<class T> 
make_vector<T> makeVect(T const &t) { 
    return make_vector<T>(t);
}

有了这个,你会打电话给:

MyFunction((makeVect(1),2,3));

正如我所说,这让我感到非常难看,以至于我毫不犹豫地提及它 - 但你可能更愿意选择它。

答案 1 :(得分:1)

我不确定您的确切用例,但您可以使用Boost.Assign来执行此操作。是的,它确实在VC10中有效。

正如评论中所发表的那样,人们可以这样做:

TestFunction(boost::assign::list_of(1)(2)(3));

答案 2 :(得分:0)

Visual Studio中MSDN page概述C ++ 11支持声明VC10 VC11不支持initialiser lists

答案 3 :(得分:0)

在Visual Studio 2010或2012年不可能。遗憾!