如何清楚地指定我传递的参数和哪些参数保持默认值?

Pub*_*bby 8 c++ overloading default-arguments c++11

因为这个问:c ++中的默认参数

说我有这样的功能: void f(int p1=1, int p2=2, int p3=3, int p4=4);

我想只使用一些参数调用它 - 其余的将是默认值.

像这样的东西会起作用:

template<bool P1=true, bool P2=true, bool P3=true, bool P4=true>
void f(int p1=1, int p2=2, int p3=3, int p4=4);
// specialize:
template<>
void f<false, true, false, false>(int p1) {
  f(1, p1);
}
template<>
void f<false, true, true, false>(int p1, int p2) {
  f(1, p1, p2);
}
// ... and so on. 
// Would need a specialization for each combination of arguments
// which is very tedious and error-prone

// Use:
f<false, true, false, false>(5); // passes 5 as p2 argument
Run Code Online (Sandbox Code Playgroud)

但它需要太多的代码才能实用.

有一个更好的方法吗?

Che*_*Alf 11

使用命名参数成语(→ FAQ链接).

Boost.Parameters库(→ 链接)也可以解决这个任务,但冗长的代码,并大大降低了清晰度支付.它在处理构造函数方面也存在缺陷.当然,它需要安装Boost库.

干杯&hth.,


Man*_*rse 7

看看Boost.Parameter库.

它在C++中实现了命名参数.例:

#include <boost/parameter/name.hpp>
#include <boost/parameter/preprocessor.hpp>
#include <iostream>

//Define
BOOST_PARAMETER_NAME(p1)    
BOOST_PARAMETER_NAME(p2)
BOOST_PARAMETER_NAME(p3)
BOOST_PARAMETER_NAME(p4)

BOOST_PARAMETER_FUNCTION(
                         (void),
                         f,
                         tag,
                         (optional            
                          (p1, *, 1)
                          (p2, *, 2)
                          (p3, *, 3)
                          (p4, *, 4)))
{
    std::cout << "p1: " << p1 
            << ", p2: " << p2
            << ", p3: " << p3
            << ", p4: " << p4 << "\n";
}
//Use
int main()
{
    //Prints "p1: 1, p2: 5, p3: 3, p4: 4"
    f(_p2=5);
}
Run Code Online (Sandbox Code Playgroud)