C++ 通过跳过可选参数填充参数包

C++ 通过跳过可选参数填充参数包,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我正在编写一个用于日志记录的助手函数:它收集调用站点 信息,同时创建错误类型的对象 模板 std::unique_ptr makeError(const char*fileName=uuu内置文件(), int lineNum=\uuuu内置的\u行(), 常量char*funcName=\uuuuu内置函数(),ArgTys&&…args){ return std::make_unique(文件名、lineNum、funcName、, 转发 这可能不那么令人困惑,或者更令人困惑。其中之一 其中

我正在编写一个用于日志记录的助手函数:它收集调用站点 信息,同时创建
错误
类型的对象

模板
std::unique_ptr makeError(const char*fileName=uuu内置文件(),
int lineNum=\uuuu内置的\u行(),
常量char*funcName=\uuuuu内置函数(),ArgTys&&…args){
return std::make_unique(文件名、lineNum、funcName、,
转发

这可能不那么令人困惑,或者更令人困惑。其中之一


其中之一。

您想如何在调用中指定替换默认参数?@walnut不应该在任何情况下替换默认参数:其目的是让编译器用这些内置参数填充默认参数。我想按照
\defiNElog(…)日志(α-Lynyx,,VaAgsSuxy),但是用现代C++代替,并且这些内置的插件是唯一的方法(直到C++ 20,但它或多或少是相同的方法).Ah好的,你想把它们放在默认参数中,因为它们不会提供引用调用站点的值。我一开始没有意识到。你想如何在调用中指定替换默认参数?@walnut不应该有任何替换它们的情况:想法是用编译程序是用那些内置的。我想沿着“代码”>定义定义日志(…)日志(α-LynLyx,,VaAgsSuxy)< /C>,但是用现代C++代替,这些内置的插件是唯一的方法(直到C++ 20,但它或多或少是相同的方法).啊,好吧,你想把它们放在默认参数中,因为它们不会提供引用调用站点的值。我一开始没有意识到。创造性方法!感觉不是100%正确,但这可能和获得创造性方法一样好!感觉不是100%正确,但这可能是最好的
template<class ErrorTy>
auto makeError(
    const char* fileName = __builtin_FILE(),
    int lineNum = __builtin_LINE(),
    const char* funcName = __builtin_FUNCTION()
) {
  return [=](auto&&... args) {
    return std::make_unique<ContextualError<ErrorTy>>(
      fileName, lineNum, funcName,
      decltype(args)(args)... // yes, this perfect fowards
    );
  };
}
auto err = makeError<FileError>()("foo.exe", "Invalid header");
auto err = makeError<FileError>{}("foo.exe", "Invalid header");