使用默认参数对模板函数进行别名



以下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被声明为函数指针,遗憾的是它不能指定默认参数。

默认参数只允许在函数声明and lambda-expressions, (since C++11)的参数列表中使用,而不允许在函数指针、函数引用或typedef声明中使用。

您可以使用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

最新更新