`
hqs7636
  • 浏览: 221006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

std.bind

FP 
阅读更多
Jump to: bind _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 Tuple appendT append prependT prepend concatT type value tuple isTypeTuple minNumArgs BoundFunc bindAlias
Bind function arguments to functions.

References:
boost::bind

Authors:
Tomasz Stachowiak

Date:
November 28, 2006

const DynArg!(0) _0;
const DynArg!(1) _1;
const DynArg!(2) _2;
const DynArg!(3) _3;
const DynArg!(4) _4;
const DynArg!(5) _5;
const DynArg!(6) _6;
const DynArg!(7) _7;
const DynArg!(8) _8;
const DynArg!(9) _9;
    When passed to the 'bind' function, they will mark dynamic params - ones that aren't statically bound In boost, they're called _1, _2, _3, etc.. here _0, _1, _2, ...
当传递给绑定功能,他们将标记动态 params-那些不静态绑定 在推动,他们被调用 _ 1、 _2、 _3 等... 在这里 _0,_ 1,_2,...

struct Tuple(T...);
    A simple tuple struct with some basic operations
与一些基本的操作的简单的元组结构

    template appendT(X)
        Statically yields a tuple type with an extra element added at its end
与一个额外的元素,在其最终添加静态生成一个元组类型

    template append(X)
        Yields a tuple with an extra element added at its end
与一个额外的元素,在其最终添加产生一个元组

        appendT!(X) append(X x);
            Yields a tuple with an extra element added at its end
与一个额外的元素,在其最终添加产生一个元组

    template prependT(X)
        Statically yields a tuple type with an extra element added at its beginning
与一个额外的元素,在其开始添加静态生成一个元组类型

    template prepend(X)
        Yields a tuple with an extra element added at its beginning
与一个额外的元素,在其开始添加产生一个元组

        prependT!(X) prepend(X x);
            Yields a tuple with an extra element added at its beginning
与一个额外的元素,在其开始添加产生一个元组

    template concatT(T...)
        Statically concatenates this tuple type with another tuple type
静态连接此元组类型与另一个元组类型

struct Tuple();
    An empty tuple struct
一个空元组结构

    alias type;
        an empty built-in tuple
一个空的内置元组

    alias value;
        an empty built-in tuple
一个空的内置元组

Tuple!(T) tuple(T...)(T t);
    Dynamically create a tuple from the given items
动态创建一个   从给定项的  元组

template isTypeTuple(T)
    Checks whether a given type is the Tuple struct of any length
检查给定的类型是否任何长度的元组结构

template minNumArgs(alias fn,fnT = typeof(&fn))
    Finds the minimal number of arguments a given function needs to be provided
查找给定的函数需要提供的参数的最小数目

class BoundFunc(FT,alias FAlias_,AllBoundArgs_);
    A context for bound/curried functions
咖喱绑定/函数的上下文

typeof(new BoundFunc!(FT,NullAlias,Tuple!(ArgList))) bind(FT, ArgList...)(FT fp, ArgList args);
    bind() can curry or "bind" arguments of a function, producing a different function which requires less parameters, or a different order of parameters. It also allows function composition.
绑定 () 可以咖喱或"   绑定 "的一个函数生产不同的功能,需要较少的参数,参数 一个不同的或命令参数。 它还允许函数组成。

    The syntax of a bind() call is:
语法一    绑定  () 调用:

    bind(function or delegate pointer { , argument });
绑定 函数或委托指针 { 参数 }) ;

    argument can be one of:参数  可以是之一:

        * static/bound argument (an immediate value)
          静态/绑定参数 (一个实时值)
        * another bound function object
          另一个绑定函数对象
        * dynamic argument, of the form _[0-9], e.g. _0, _3 or _9
          窗体 _ [0-9] 例如 _0、 _3 或 _9 的动态参数

    The result is a function object, which can be called using call(), func() or opCall(). There also exists a convenience function, ptr() which returns a delegate to call/func/opCall
结果是可以使用 call()、 func() 或 opCall() 调用的函数对象。 此外存在一个方便的函数返回到调用/func/opCall 的委托的 ptr()

    The resulting delegate accepts exactly as many parameters as many distinct dynamic arguments were used.
结果委托接受完全一样多参数,很多不同的动态参数使用。

    - bind(&foo, _0, _1) // will yield a delegate accepting two parameters
                             将产量接受两个参数的委托
    - bind(&foo, _1, _0) // will yield a delegate accepting two parameters
                             将产量接受两个参数的委托
    - bind(&bar, _0, _1, _2, _0) // will yield a delegate accepting three parameters                         
                                 将产量接受三个参数的委托


    The types of dynamic parameters are extracted from the bound function itself and when necessary, type negotiation is performed. For example, binding a function
动态参数的类型提取从本身的绑定功能和有需要时, 键入谈判 执行。
例如绑定一个函数

    void foo(int a, long b)

    // with:
    bind(&foo, _0, _0)

    will result in a delegate accepting a single, optimal parameter type. The best type is computed using std.typetuple.DerivedToFront, so in case of an int and a long, long will be selected. Generally, bind will try to find a type that can be implicitly converted to all the other types a given dynamic parameter uses.
会接受一个单、 优化参数类型的委托。 最佳的类型被计算 使用 std.typetuple.DerivedToFront,所以例 int 和很长一段长时间将被选定。 通常,   绑定  将尝试查找 可以隐式转换为所有其他类型给定的动态参数的类型使用。

注意:
    Note:
    in case of numeric types, an explicit, but transparent (to the user) cast will be performed
数值类型的情况下显式,但透明 (用户) 的强制转换将会执行

    Function composition works intuitively:
功能组成直观地工作:

    bind(&f1, bind(&f2, _0))

    which will yield a delegate, that takes the argument, calls f2, then uses the return value of f2 to call f1. Mathematically speaking, it will yield a function composition:
会产生一个接受该的参数的委托调用 f2,然后使用 f2 的返回值调用 f1。 数学 说,它会生成函数组成:

    f1(f2(_0))

    When one function is composed multiple times, it will be called multiple times - Bind does no lazy evaluation, so
当一个函数由多次时,它会被调用多次-Bind 所以并没有懒惰的评价

    bind(&f3, bind(&f4, _0), bind(&f4, _0))

    will produce a delegate, which, upon calling, will invoke f4 two times to evaluate the arguments for f3 and then call f3
将产生委托,电话后, 将调用 f4 两次评估 f3 参数,然后调用 f3

    One another feature that bind() supports is automatic tuple expansion. It means that having functions:
另一个特征, 绑定 () 支持是自动的元组扩展。 它意味着该函数:

    void foo(int a, int b)
    Tuple!(int, int) bar()

    Allows them to be bound by writing:允许他们受写:

    bind(&foo, bind(&bar))
    // or
    bind(&foo, tuple(23, 45))

template bindAlias(alias FT)
    bindAlias() is similar to bind(), but it's more powerful. Use bindAlias() rather than bind() where possible.
类似于 bind(),但这是更强大。 使用    bindAlias  (),而不是 bind() 在可能的情况下。
    The syntax is:语法是:

    bindAlias!(Function)(argument, argument, argument, argument, ...);

    bindAlias takes advantage of using aliases directly, thus being able to extract default values from functions and not forcing the user to bind them. It doesn't, however mean that the resulting delegate can be called, omitting some of its parameters. It only means that these arguments that have default values in the function provided to bindAlias don't have to be bound explicitly.
直接使用别名,因此能够从函数中提取默认值并不强制用户利用  bindAlias  若要将它们绑定。 它不,但表示结果委托可以调用,省略参数的一些及其参数。 它只意味着这些 在函数中提供有默认值的参数    bindAlias  不必将显式绑定。

    Additionally, bindAlias takes care of functions with out/inout parameters, by converting them to pointers internally. A function like:
此外,   bindAlias  照顾使用出 inout 的参数的函数的通过将他们在内部转换为指针。 像一个函数:

    void foo(inout a)

    can be bound using:可绑定使用:

    int x;
    bindAlias!(foo)(&x);

    Note:注意:

    there is no bind-time check for reference nullness, there is however a call-time check on all references which can be disabled by using version=BindNoNullCheck or compiling in release mode.
有是引用 nullness 没有绑定时检查,但是调用时检查所有引用,可以禁用对 使用版本 = BindNoNullCheck 或发布模式中编译。
分享到:
评论

相关推荐

    通过c++11的std::bind及std::function实现类方法回调,模拟Qt实现信号槽

    c++11引入了std::bind及std::function,实现了函数的存储和绑定,即先将可调用的对象保存起来,在需要的时候再调用。定义了SignalObject信号类和SlotObject槽类,其中信号类中的 std::function(int)> _call就是要...

    C++ 11 std::function和std::bind使用详解

    C++ 11 std::function和std::bind使用详解 C++ 11 中引入了两个重要的功能:std::function 和 std::bind,它们都是基于 C++ 11 的新特性,用于实现函数指针的功能。下面将详细介绍这两个功能的使用和区别。 std::...

    C++11中lambda、std::function和std:bind详解

    这篇文主要关注三个核心概念:lambda表达式、std::function和std::bind。 **Lambda表达式**是C++11引入的一种内联匿名函数,它允许我们在需要的地方直接定义函数对象,而无需单独声明一个函数。Lambda表达式的语法...

    async:异步对象的跨平台事件循环库

    异步网络套接字的跨平台事件循环库。 这是D语言实现的网络库的简单包装。 它的封装简单明了,非常适合阅读和参考。 尽管很小,但性能还是不错的,它是真正的全双工模式。... listener.bind( new InternetAddress (

    C++ STL 内 std::{bind/tuple/function} 简单实现

    在C++标准库STL中,`std::bind`、`std::tuple`和`std::function`是非常重要的工具,它们提供了高级的函数操作和参数管理能力。下面将详细解释这三个概念及其简单实现的关键点。 首先,我们来看`std::function`。`...

    cpp代码-std::bind & function

    在C++编程中,`std::bind` 和 `std::function` 是两个非常重要的函数对象容器,它们在处理函数和函数对象时提供了极大的灵活性。这两个工具都是C++标准库的一部分,通常用于回调、事件处理、函数对象的封装以及异步...

    c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    而`std::bind`可以帮助我们将函数与特定的参数预先绑定,例如,如果我们有一个类`test`有一个成员函数`int operator()(int a)`,我们可以通过`std::bind(&test::operator(), &obj, _1)`来创建一个可调用对象,其中`_...

    MIL-STD-720A.031972.PDF

    MIL-STD-720A标准规定了黄色烟火的组成_formula,包括tetranitro-Zirconium Bind、Nitrate、Silicon carbazole、Hydride Solution等多种成分。这些成分的比例和粒度都有明确的规定。例如,tetranitro-Zirconium Bind...

    ML_bind-源码.rar

    在编程领域,尤其是C++中,`std::bind`是C++标准库的一部分,它允许我们将函数、成员函数或者函数对象与特定的参数绑定在一起,形成一个新的可调用对象。这种绑定技术在函数式编程和元编程中起到了关键作用,能够...

    zhiqiang-hu#AwesomeCppNotes#std::function和std::bind1

    在 <functional> 头文件中, std::function 是个可调用Callable对象的容器,可以容纳 函数、函数指针、lambda表达式、成员函

    c++ boost bind

    #include <boost/bind.hpp> int add(int a, int b) { return a + b; } // 绑定第一个参数,第二个参数在调用时提供 auto bound_add = boost::bind(add, 5, _1); // 调用bound_add,传入2作为第二个参数 int ...

    实现了类似std::function /bind /shared_ptr功能

    实现了标准库中的function和bind以及智能指针,linux/windows通用。由于公司GCC版本较老,嵌入式的gcc也无法由我来控制,windows上使用的一些类似智能指针,在linux上无法使用,甚是不爽,于是自己手动写了一份,...

    C++11 并发指南之std::thread 详解

    "C++11 并发指南之std::thread 详解" 本文主要介绍了 C++11 中的 std::thread 类,它是 C++11 并发指南的重要组件。std::thread 类提供了创建和管理线程的功能,允许开发者在程序中创建多个线程,从而实现并发编程...

    基于boost的bind与function的消息处理框架

    #include <boost/bind.hpp> #include <boost/function.hpp> class MessageHandler { public: typedef boost::function(int, std::string)> HandlerFunc; void registerHandler(const HandlerFunc& handler) { ...

    C++ function、bind以及lamda表达式

    C++0x引入了多项新特性,其中lambda表达式、std::function对象和bind机制是提升代码灵活性和可读性的重要工具。这三者之间的紧密联系在于它们都能在处理回调函数时提供便利。 1. **std::function** std::function...

Global site tag (gtag.js) - Google Analytics