您的问题的答案在技术上是肯定的,lambda 主体可以实例化模板函数。实际示例不起作用,因为int n
不能那样使用作为参数。
有一个简单的解决方法
template<auto x>
using constant_t = std::integral_constant< std::decay_t<decltype(x)>, x >;
template<auto x>
constexpr constant_t<x> constant = {};
template <int n> int fn () { int arr[n] = {0}; return sizeof(arr); }
auto fx = [] (auto n) { return fn<n>(); };
std::cout << fx( constant<3> );
活生生的例子。
在这里,我制作了constant<x>
创建std::integral_constant<X, x>
. 这是一个无状态(但不是无价值!)类型,它有一个 constexpr 转换为其值。
我们可以将它传递给 lambda,只要 lambda 按值获取它,我们就可以将其转换为constexpr
lambda 中的值,包括将其作为模板非类型参数传递,实例化模板函数特化,如您所问为了。
可以在没有constant
变量模板的情况下完成,即如果您没有auto
参数支持:
template<std::size_t N>
using index_t = std::integral_constant<std::size_t, N>;
template<std::size_t N>
constexpr index_t<N> index = {};
我们可以使用它的特定类型版本,然后传递它,它的工作方式相同。
一边,constant<?>
很有趣。例如:
using upFILE=std::unique_ptr<
std::FILE,
constant_t<std::fclose>
>;
upFILE file( fopen("hello.txt", "r") );
做正确的事。