gpt4 book ai didi

c++ - 已知参数的模板推导失败

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:47 25 4
gpt4 key购买 nike

考虑以下代码

template<typename T>
T modify(const T& item, std::function<T(const T&)> fn)
{
return fn(item);
}

尝试将其用作 modify(5, [](const int& i){return 10*i;}); 时编译失败

could not deduce template argument for 'std::function<T(const T &)> from lambda

我知道编译器无法推断T来自 lambda,因为 lambda 不是 std::function , 但不是 T已经从5推导出来?

我可以克服它使用

template<typename T, typename F>
T modify(const T& item, const F& functor)
{
return functor(item);
}

前面的示例编译,但在我看来不太直观。有没有办法让函数参数保持std::function并让它的模板参数自动从item推导出来?

最佳答案

您基本上想要做的是防止演绎发生。如果发生模板推导,它将失败(因为 lambda 不是 std::function<> - T 是从第一个参数推导的并不重要,推导必须在作为推导上下文的每个参数中成功)。防止推导的方法是将整个参数放在非推导的上下文中,最简单的方法是将类型放入 nested-name-specifier。我们创建这样一个类型包装器:

template <class T> struct non_deduce { using type = T; };
template <class T> using non_deduce_t = typename non_deduce<T>::type;

然后将类型包裹在里面:

template<typename T>
void foo(const T& item, std::function<void(T)> f);

template<typename T>
void bar(const T& item, non_deduce_t<std::function<void(T)>> f);

foo(4, [](int ){} ); // error
bar(4, [](int ){} ); // ok, we deduce T from item as int,
// which makes f of type std::function<void(int)>

但是请注意:

template <typename T, typename F>
void quux(const T&, F );

的可读性并没有降低,严格来说性能更高。

关于c++ - 已知参数的模板推导失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38333699/

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