相关疑难解决方法(0)

为"make_function"推断lambda或任意callable的调用签名

在某些情况下,希望能够键入 - 擦除可调用的(例如函数,函数指针,带有operator()lambda的对象实例mem_fn),例如在使用带有C++ 11 lambdas的Boost适配器中,其中可复制的和可默认构造的类型是必需的.

std::function将是理想的,但似乎没有办法自动确定用于实例化类模板的签名std::function.是否有一种简单的方法来获取任意可调用的函数签名和/或将其包装在适当的std::function实例化实例(即make_function函数模板)中?

具体来说,我正在寻找一个或另一个

template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }
Run Code Online (Sandbox Code Playgroud)

这样make_function([](int i) { return 0; })返回std::function<int(int)>.显然,如果一个实例可以使用多个签名(例如,具有多个,模板或默认参数operator()的对象)进行调用,那么预计这不会起作用.

尽管非过度复杂的非Boost解决方案是优选的,但Boost很好.


编辑:回答我自己的问题.

c++ lambda type-inference function c++11

26
推荐指数
1
解决办法
3945
查看次数

一种通过索引过滤范围的方法,只从过滤的索引中获取min_element?

在对这个问题的评论中,有一个迭代过多的元素 - 使用基于范围的循环还有一个额外的问题 - 这可能有"索引视图"在容器上,即具有过滤掉一些索引的子范围.

另外,我遇​​到了一个问题,即从过滤掉一些索引的范围中找到最小值.

也就是说,可以用std和/或boost算法,过滤器替换下面的代码 - 使其更具可读性和可维护性:

template <typename Range, typename IndexPredicate>
auto findMin(const Range& range, IndexPredicate ipred) 
     -> boost::optional<typename Range::value_type>
{
    bool found = false;
    typename Range::value_type minValue{};
    for (std::size_t i = 0; i < range.size(); ++i)
    {
        if (not ipred(i))
            continue;
        if (not found)
        {
            minValue = range[i];
            found = true;
        }
        else if (minValue > range[i])
        {
            minValue = range[i];
        }
    }
    if (found)
    {
        return minValue;
    }
    else
    {
        return boost::none;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ templates boost c++11 c++14

6
推荐指数
1
解决办法
965
查看次数

标签 统计

c++ ×2

c++11 ×2

boost ×1

c++14 ×1

function ×1

lambda ×1

templates ×1

type-inference ×1