gpt4 book ai didi

c++ - 参数包、捕获子句和初始值设定项

转载 作者:行者123 更新时间:2023-11-30 01:44:01 25 4
gpt4 key购买 nike

注意:这个问题是出于好奇。


考虑 lambda 的文档和一个 parameter pack .

下面的代码是合法的:

template<typename... T>
void f(T... t) {
auto lambda = [t...](){ /* do something */ };
// do something else
}

这个也不言而喻:

void f(int i) {
auto lambda = [i = i](){ /* do something */ };
// do something else
}

我想知道是否可以在参数包的捕获子句中定义一个初始值设定项。
像这样:

template<typename... Args>
void f(Args&&... args) {
auto lambda = [params = std::forward<Args>(args)...](){ /* do something */ };
// do something else
}

好吧,我怀疑它没有意义,但它至少给出了一个想法。
有什么可行的解决方案吗?


请不要问我为什么要那样做。我不想那样做。正如我所说,这是为了好奇。

最佳答案

没有。

你能做的最好的事情是:

template<typename... Args>
void f(Args&&... args) {
auto lambda = [params = std::make_tuple(std::forward<Args>(args)...)]()
{ /* do something */ };
// do something else
}

然后作为元组params交互,包括使用get

我发现您最终不得不离开 lambda 的世界来再次解压元素。也许你可以用这样的助手来做到这一点:

template<std::size_t...Is, class F>
decltype(auto) unpack_impl( std::index_sequence<Is...>, F&& f ) {
return std::forward<F>(f)(std::integral_constant<std::size_t, Is>{}...);
}
template<std::size_t N, class F>
decltype(auto) unpack( F&& f ) {
return unpack_impl( std::make_index_sequence<N>{}, std::forward<F>(f) );
}

它采用模板非类型参数 N,然后生成一组 integral_constants 以及 constexpr operator size_t 和值 0 通过 N-1,并将它们传递给您通过 unpack 的 lambda。

使用示例:

template<typename... Args>
auto print_later(Args&&... args) {
auto lambda = [params = std::make_tuple(std::forward<Args>(args)...)](
auto&& stream
)
{
unpack<sizeof...(Args)>( [&](auto...Is){
using discard=int[];
(void)discard{0,(void(
stream << std::get<Is>( params )
),0)...
};
});
};
return lambda;
}

注意 Is 被传递给内部 lambda。基本上,这种技术让我们解压参数包并在可扩展的上下文中获取其值,而无需创建新的显式模板函数;相反,我们创建了一个可变参数 lambda,并使用参数的类型(或对它们的 constexpr 操作)来获取解包结果。

上面是一个函数,它接受一组参数,并返回一个接受流并将它们全部打印出来的函数。

live example

unpack 函数可以变得更加通用;至少,让它接受一个integer_sequence,最后甚至一个变体也可以直接接受一组类型。

关于c++ - 参数包、捕获子句和初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36874364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com