这是一个非常基本的问题,请耐心等待。
考虑C ++中的以下函数:
void foo(int a, int b, int c)
{
//do something
}
我可以这样调用这个函数:foo(b=2, c=3, a=2)
吗?
我认为这有某种名称(可能是位置参数)。如果你也可以在答案中澄清它,那就太好了。
答案 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,并通过指针传递。