c – 扩展参数包可以为默认函数参数“填写”吗?

以下代码 fails to compile
#include <iostream>

template<typename F,typename ...Args>
static auto wrap(F func,Args&&... args)
{
    return func(std::forward<Args>(args)...);
}

void f1(int,char,double)
{
    std::cout << "do nada1\n"; 
}

void f2(int,char='a',double=0.)
{
    std::cout << "do nada2\n"; 
}

int main()
{
    wrap(f1,1,'a',2.); 
    wrap(f2,'a'); 
}
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

main.cpp: In instantiation of 'auto wrap(F,Args&& ...) [with F = void(*)(int,double); Args = {int,char}]':
main.cpp:22:20:   required from here
main.cpp:6:44: error: too few arguments to function
     return func(std::forward<Args>(args)...);

似乎遵循关于“参数包最后”的规则(至少在声明中),并且在扩展之后应该形成正确的函数调用:f2可以使用1,2或3个参数来调用,因此参数太少作为一个错误似乎是“苛刻的”.它也不像deduction problem(这将是我的猜测 – 但由于错误信息而摇摆不定)

这是一个缺失的功能,还是违反标准的观点?

解决方法

您不是从模板调用具有认参数的函数.

你正在调用一个函数指针,它指向一个正好3个参数的函数,既不是更多也不少.

当然编译器抱怨失踪的第三个.

你可以用一个可变的函子做你想要做的事,since C++14 even a lambda

wrap([](auto&&... args){return f2(std::forward<decltype(args)>(args)...);},'a');

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...