gpt4 book ai didi

c++ - 如何将 lambda 传递给模板参数

转载 作者:行者123 更新时间:2023-12-04 15:01:38 26 4
gpt4 key购买 nike

我正在尝试定义一个函数 func(),它返回一个 std::string

template<typename T = std::string, template<typename> typename F = decltype([](const T &t){return t;})>
std::string func(const T &t){
F f;
return f(t);
}

如您所见,我正在尝试做的是传递一个 lambda 作为模板参数,这样我就可以像这样调用函数 func():

func<int, decltype([](int a){return std::to_string(a);})>(2);

另外,我为模板参数设置了默认值,这样我就可以这样调用它:

func<>("abc");

但是,上面的代码给了我一个错误:

<source>:39:54: error: expected unqualified-id before 'decltype'
39 | template<typename T, template<typename> typename F = decltype([](const T &t){return t;})>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:39:54: error: invalid default argument for a template template parameter
<source>:39:54: error: expected '>' before 'decltype'

顺便说一句,我的 C++ 版本是 C++11。

最佳答案

在 C++11 中?使用 lambda 作为模板参数?

鉴于 lambda(在 C++20 之前)不能在未计算的上下文中使用(所以在 decltype() 中)并且不能默认构造,我不看看方法。

我能想象的最好的,在 C++11 中,重现类似的东西如下所示

template <typename T, typename F = std::function<std::string(T const &)>>
std::string func (T const & t, F f = [](const T &t){return std::string{t};})
{ return f(t); }

你可以只用第一个参数调用

func("abc");

假定您接受默认的 lambda(但保存为 std::function)。

如果你不喜欢默认的,你也可以传递另一个 lambda

func(1, [](int const &){ return "one"; });

但作为传统参数,而不是作为模板参数。

关于c++ - 如何将 lambda 传递给模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66857153/

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