C ++位置参数

时间:2009-11-06 12:46:16

标签: c++ parameters

这是一个非常基本的问题,请耐心等待。

考虑C ++中的以下函数:

void foo(int a, int b, int c)
{
   //do something
}

我可以这样调用这个函数:foo(b=2, c=3, a=2)吗?

我认为这有某种名称(可能是位置参数)。如果你也可以在答案中澄清它,那就太好了。

4 个答案:

答案 0 :(得分:10)

不是标准C ++,没有。您必须按函数原型指定的顺序提供参数。

答案 1 :(得分:6)

使用核心c ++功能是不可能的。但是在boost集合中有一个库可以实现这一目标。

使用boost.parameters,例如:

#include <boost/graph/depth_first_search.hpp> // for dfs_visitor

BOOST_PARAMETER_FUNCTION(
    (void), depth_first_search, tag
    …signature goes here…
)
{
   std::cout << "graph=" << graph << std::endl;
   std::cout << "visitor=" << visitor << std::endl;
   std::cout << "root_vertex=" << root_vertex << std::endl;
   std::cout << "index_map=" << index_map << std::endl;
   std::cout << "color_map=" << color_map << std::endl;
}

int main()
{
    depth_first_search(1, 2, 3, 4, 5);

    depth_first_search(
        "1", '2', _color_map = '5',
        _index_map = "4", _root_vertex = "3");
}

答案 2 :(得分:1)

在标准C ++中你不能。 如果您确实需要,请考虑使用Boost Parameter Library

答案 3 :(得分:1)

我没有使用过Boost参数库,但是通过参数对象获得此类功能的大部分好处的另一种方法是:

struct fooParams {
    int a_;
    int b_;
    int c_;
    fooParams &a(int i) { a_ = i; return *this; }
    fooParams &b(int i) { b_ = i; return *this; }
    fooParams &c(int i) { c_ = i; return *this; }
    // can also provide a constructor, or other means of setting default values
};

void foo(fooParams params) { // or pass by const reference
    int a = params.a_;
    int b = params.b_;
    int c = params.c_;
    ...
}

fooParams params;
foo(params.b(2).c(3).a(2));

您可以同时执行Microsoft添加额外可选参数的操作,而不会破坏二进制兼容性,方法是在参数对象中放置一个版本号,确保它是POD,并通过指针传递。