【问题标题】:C++: Applying an argument to range of functionsC ++:将参数应用于函数范围
【发布时间】:2012-11-20 02:52:55
【问题描述】:

是否有更标准的方法将参数应用于函数范围?我想出了下面列出的解决方案,但感觉不对 - 应该已经有一些东西可以构建这样的逻辑。

template<typename Function, typename Result, typename Argument>
struct apply_argument_t {
    Argument x;
    Result operator () (Function f) {
        return f (x);
    }
};

一个简单的用例:

transform (in.begin(), in.end(), out.begin(), apply_argument(x));

我故意跳过了实现细节。

编辑:但无论如何,正如他们被要求的那样:

in 是一系列一元函数(例如vector&lt;int(*)(char)&gt;

out 是这些一元函数结果的范围(例如vector&lt;int&gt;

apply_argument 类似于结构,但没有模板规范和初始化(例如apply_argument_t&lt;int(*)(char), int, char&gt;

我也错过了没有搜索 C++11 的解决方案的评论。

【问题讨论】:

  • 我不太明白这个问题。 inout 是什么?什么是apply_argument(类模板的一个实例,但带有什么模板参数?)?

标签: c++ function arguments


【解决方案1】:

我故意跳过了实现细节。

这些细节包括你从哪里得到的,例如Argument 类型来自。

无论如何,使用 lambda。

【讨论】:

  • 它是一元函数范围内的一个元素,我还添加了一些说明 - 感谢您的评论。我还评论说我不搜索 C++11。
【解决方案2】:

我同意 Alf 的观点,但让我们向您展示如何在您的情况下做到这一点。

如果您使用 C++11,以下是 lambda 问题的可能解决方案: (我使用Function,但您需要使用自己的特定函数类型。)

Argument x;
transform (in.begin(), in.end(), out.begin(),
  [x](Function f)
  {
    return f(x);
  }
);

进一步阅读维基百科,C++11。

【讨论】:

  • 谢谢,我也添加了一些说明(虽然没有 C++11),因此在您的示例中它更像是倒置的:e(f), f 将是传递给函数的对象在in 范围内找到e
  • auto 在函数参数中是无效的,所以在我们有像 decltype(in)::reference 这样的多态 lambda 之前可以使用(const_reference 也是一个选项,或者如果 in 是 @ 甚至是强制性的987654331@-合格)。
  • @LucDanton:谢谢,我更正了,抱歉。你是对的,他应该在 lambda 函数中提供他的类型。
【解决方案3】:

如果您不打算使用 C++11,则使用来自 STL 的&lt;functional&gt; 有不同的解决方案:

#include <functional>
#include <algorithm>

template<typename Argument, typename Result>
Result apply_function(Return (*f)(Argument), Argument x)
{
  return f(x);
}

transform (in.begin(), in.end(), out.begin(), bind2nd(ptr_fun(apply_function), x) );

但我认为您的解决方案更清洁。我只能考虑一种可能的简化:

template<typename Argument, typename Result>
struct apply_argument_t {
    Argument x;
    Result operator () (Result (*f)(Argument)) {
        return f (x);
    }
};

应该有一个解决方案使用 Boost lambda 库,但是 it does not work 出于某种原因:

#include<boost/lambda/lambda.hpp>
#include<boost/lambda/bind.hpp>
using namespace boost::lambda;
transform(in.begin(), in.end(), out.begin(), bind(_1, x));

Reference also here.(我什么都试过了,protect,但都没有用。)

【讨论】:

  • 占位符不容易在第一个位置(函数的位置)工作,它是一个更简单的设计,根本不支持该功能,这是我所知道的所有惰性评估库的情况。
  • 是的,但是文档应该明确说明这一点。在 Boost 页面上甚至还有一个占位符位于首位的示例:bind(_1, a, b, c)(foo);
猜你喜欢
  • 2017-08-16
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2014-03-04
  • 2013-01-07
  • 2016-05-28
  • 2017-04-28
相关资源
最近更新 更多