使用默认参数为模板函数起别名
Alias a template function with default parameters
以下 C++ 代码无法编译:
template <typename T>
void f(int, bool = true);
void g()
{
auto h = f<int>;
h(1); // error: too few arguments to function
}
相反,我必须使用第二个参数调用 h
:
h(1, true);
为什么 h(1)
不起作用?
有没有一种简单的方法可以在保留默认函数参数的同时为模板函数设置别名以绑定模板参数?
h
声明为函数指针,不幸的是它不能指定 default arguments.
Default arguments are only allowed in the parameter lists of function declarations and lambda-expressions, (since C++11)
and are not allowed in the declarations of pointers to functions, references to functions, or in typedef declarations.
您可以改用 lambda 包装 f
。例如
auto h = [](int i) { f<int>(i); };
h(1); // -> f<int>(1, true), using f's default argument
或者在 lambda 上也指定默认参数。
auto h = [](int i, bool b = true) { f<int>(i, b); };
h(1); // -> f<int>(1, true), using h, i.e. lambda's default argument
h(1, true); // -> f<int>(1, true), not using default argument
h(1, false); // -> f<int>(1, false), not using default argument
以下 C++ 代码无法编译:
template <typename T>
void f(int, bool = true);
void g()
{
auto h = f<int>;
h(1); // error: too few arguments to function
}
相反,我必须使用第二个参数调用 h
:
h(1, true);
为什么 h(1)
不起作用?
有没有一种简单的方法可以在保留默认函数参数的同时为模板函数设置别名以绑定模板参数?
h
声明为函数指针,不幸的是它不能指定 default arguments.
Default arguments are only allowed in the parameter lists of function declarations
and lambda-expressions, (since C++11)
and are not allowed in the declarations of pointers to functions, references to functions, or in typedef declarations.
您可以改用 lambda 包装 f
。例如
auto h = [](int i) { f<int>(i); };
h(1); // -> f<int>(1, true), using f's default argument
或者在 lambda 上也指定默认参数。
auto h = [](int i, bool b = true) { f<int>(i, b); };
h(1); // -> f<int>(1, true), using h, i.e. lambda's default argument
h(1, true); // -> f<int>(1, true), not using default argument
h(1, false); // -> f<int>(1, false), not using default argument