c++ - 使用 lambda 和全局函数调用 ranges::for_each

标签 c++ c++11 c++14 range-v3

以下代码按预期工作:

void foo(auto const &){}

auto const rng{ranges::view::all(v)};
ranges::for_each(rng, [](auto const & r){
    foo(r);
});

但是以下内容:

void foo(auto const &){}

auto const rng{ranges::view::all(v)};
ranges::for_each(rng, &foo);

给出编译错误:

template argument deduction/substitution failed:
couldn't deduce template parameter 'F'

我看了一下 source但老实说,我无法理解这个问题。

最佳答案

如果没有明确指定所需的重载/实例化,您不能获取重载模板 函数的地址。

在您的第一个代码段中传递一个 lambda 表达式 是解决此问题的好方法。

或者,如果您有权访问 foo,您可以将它变成一个函数对象:

namespace detail
{
    struct foo_t
    {
        template <typename T>
        void operator()(const T&) const { /* ... */ }
    };
}

constexpr detail::foo_t foo{};

这允许你写:

ranges::for_each(rng, foo);

关于c++ - 使用 lambda 和全局函数调用 ranges::for_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141181/

相关文章:

c++ - 没有 constexpr 的模板非类型参数的类型转换

c++ - "a variable declared with an auto specifier cannot appear in its own initializer"

c++ - 将值存储在指针 var 中

C++ - 为什么 boost::hash_combine 是组合散列值的最佳方式?

c++ - 没有全局变量初始化

C++ Nifty Counter 成语;为什么?

c++ - lambda 函数的类型

c++ - std::chrono 纳秒计时器适用于 MSVC,但不适用于 GCC

c++ - 这种方法会涉及内存重新分配从而影响其效率吗?

visual studio 2015 RC 访问冲突中的 C++ 可恢复函数(yield)