问题标签 [stdbind]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3301 浏览

c++ - std::bind() - 从派生类的成员函数中获取基类受保护的成员函数

我想bind()从派生类中获得我的基类版本的函数。该功能在底座中标记为受保护。当我这样做时,代码在 Clang (Apple LLVM Compiler 4.1) 中顺利编译,但在 g++ 4.7.2 和 Visual Studio 2010 中都出现错误。错误类似于:“'Base::foo': cannot访问受保护的成员。”

这意味着引用的上下文实际上是在内部bind(),当然该函数被视为受保护的。但是不应该bind()继承调用函数的上下文——在这种情况下,Derived::foo()——因此将基方法视为可访问的?

下面的程序说明了这个问题。

为什么行为上的差异?哪个是对的?错误编译器有什么解决方法?

0 投票
1 回答
271 浏览

c++ - std::function 指向接受右值争论的成员函数的指针 MSVC2010 SP1

我想创建一个 std::function 绑定到采用右值参数的成员函数。这是我无法编译的尝试(“xxfunction(154): error C2664: ... You cannot bind an lvalue to a rvalue reference”等等)。

我做了一些阅读,我认为这与 std::function 没有使用完美转发有关,但我不知道如何让它工作。

编辑:

这是一个半可行的解决方法,但它并不完美,因为调用 pF 现在将使用左值并移动它。

0 投票
1 回答
3400 浏览

c++ - 将 std::bind 成员函数绑定到对象实例的快捷方式,无需绑定参数

我有一个带有几个参数的成员函数。我想将它绑定到特定的对象实例并将其传递给另一个函数。我可以用占位符做到这一点:

但这有点笨拙——首先,当参数数量发生变化时,我也必须更改所有绑定调用。但此外,键入所有占位符非常繁琐,而我真正想要的是方便地创建一个包含对象引用的“函数指针”。

所以我想做的是:

有谁知道一些不错的方法来做到这一点?

0 投票
2 回答
6739 浏览

c++ - 如何绑定传递未指定调用包装器的成员函数模板

我尝试使用 VC11 和 g++ 4.7.2 编译以下示例:

但它以错误结束。我不确定粘贴整个编译器输出是否合理,但通常

vc11 说:

错误 C2664: 'void std::_Pmf_wrap::operator ()(_Farg0 &,_V0_t) const' : 无法将参数 3 从 'void' 转换为 'std::_Bind,Y *,std::_Nil,std::_Nil ,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152 1 ConsoleApplication1 (Microsoft Visual C++ Compiler Nov 2012 CTP)

和 g++:

编译完成但出现错误:
source.cpp: In instance of 'X::X(T) [with T = std::_Bind(Y*)>]':
source.cpp:28:33: required from here
source.cpp :8:9: 错误:不匹配调用 '(std::_Bind_helper(Y*)>), X* const, std::_Bind(Y*)>&>::type {aka std::_Bind( Y*)>)>(X*, std::_Bind(Y*)>)>}) ()'

有没有办法解决这个问题。保存主要思想对我来说非常重要——一个可以用任何可调用对象(函数对象、函数指针或函数返回的调用包装器std::bind())实例化的类。

如果有人帮助,我将不胜感激。

PS如果我创建一个实例X,传递函数对象或函数指针,它就会编译。

0 投票
2 回答
233 浏览

c++ - 奇怪的模板语法

我一直在查看 gcc-4.7.2 的源代码,std::functionstd::bind遇到了一些我不理解的用于成员函数指针的语法。

我不明白的是_Maybe_wrap_member_pointer

  • _Tp为什么和之间没有逗号_Class::*

  • 给定成员函数void foo::bar()(在下面的示例应用程序中),这里将解决什么_Tp问题_Class::*

下面是我的示例应用程序,它绑定了成员函数指针和对象。(我已经提取了与std::bind成员函数的专业化/内部相关的源代码)

0 投票
1 回答
174 浏览

c++ - 提供方法指针和派生类型对象时 std::bind 的一致性

这个问题基本上是我给出的这个答案的后果。我刚刚意识到标准中的措辞似乎省略了一些情况。考虑这段代码:

该标准在 20.8.9.1.2 中描述了std::bind调用它时的效果和发生的情况。它转发到20.8.2,相关部分是:

20.8.2 要求 [func.require]

1按如下方式定义INVOKE :(f, t1, t2, ..., tN)

(t1.*f)(t2, ..., tN)whenf是指向类的成员函数的指针,T并且t1是类型对象T或对类型对象的T引用或对派生于的类型对象的引用T

((*t1).*f)(t2, ..., tN)whenf是指向类的成员函数的指针,T并且t1不是上一项中描述的类型之一;

t1.*fN == 1andf是指向类的成员数据的指针T并且t1是类型对象T或对类型对象的T引用或对派生于的类型对象的引用时T

(*t1).*fwhenN == 1f是指向类的成员数据的指针,T并且t1不是上一项中描述的类型之一;

f(t1, t2, ..., tN)在所有其他情况下。

读到这里,第一个列表项似乎允许三种情况:

  • t1是类型的对象T
  • 或对类型对象的引用T
  • 或对派生自的类型的对象的引用T

但在我的例子中,两者都不是。它是派生自 的类型T,但没有引用。上面列出的情况不应该是:

  • t1是类型的对象T
  • 或派生自的类型的对象T
  • 或对类型对象的引用T
  • 或对派生自的类型的对象的引用T

当然,这同样适用于 20.8.2 中的第三个列表项。

问题 1:由于 GCC 和 Clang 都接受我的代码,我想知道这是否是违反标准的缺陷报告,或者我只是读错了。

问题 2:使用多重/虚拟继承,即使一个类型派生自T,也可能无法简单地调用(t1.*f)(...)它,对吗?这也是我应该关注的事情,还是标准在给定的上下文中清楚地定义了“源自”?

0 投票
4 回答
1969 浏览

c++ - 为什么从 std::placeholders::_1 而不是 _0 开始?

c++ 中的大多数内容都是 0,而不是基于 1。只是出于好奇,为什么占位符 1 基于?意思是 _1 是第一个参数,而不是 _0。

0 投票
1 回答
5090 浏览

c++ - std::bind - 在 Visual Studio 中编译意外(未声明的标识符)错误

对我来说,另一个令人不安的错误消息,如果我正确理解 std::bind 我可以像_1定义一个未给定的参数一样争论吗?正确的?考虑以下行:

这应该有效,对吧?这将用于 std::find_if() 函数,因此第一个参数应该是值类型,第二个参数应该是字符串。

然而,Visual Studio 2010 抱怨这一点并显示以下错误消息:

错误 C2065:“_1”:未声明的标识符

这很奇怪,我怎么能在 Visual Studio 中说“嘿,第一个参数没有绑定”。Pred 是一个以value_type, const std::string&参数为参数的简单函数 - 返回一个布尔值。

0 投票
1 回答
1368 浏览

c++ - 如何将绑定与通过引用传递的抽象类一起使用

我正在尝试将 std::transform 与 std::bind 一起使用来简化循环。这是一些代码:

这不编译。

我正在使用 VS2008 SP1 并且遇到了很多我不理解的模板错误,所以我在 ideone (gcc 4.7.2) 中进行了尝试。那里我有一些更易读的错误,我得出的结论是它与 ITest 是抽象的有关。

但是我尝试通过更改传递测试对象的方式来尝试,如果我通过指针进行,它可以工作

那么有什么我可以用来保留函数签名并仍然使用带有绑定的变换而不是循环的东西吗?

0 投票
1 回答
731 浏览

c++ - 使用可变参数模板和类型列表将不透明数组映射到函数参数

TLTR:我想根据存储在可变参数模板列表中的索引定义的特定顺序将模板容器中的一些数组映射到函数的参数(我想不出更简单的方法来定义问题)。

数组是使用存储的,void*但数组和函数参数之间的类型安全由辅助类保证。同一个帮助类必须扩展给定的参数包,获取适当的数组,将它们绑定到函数指针并调用函数。这就是我卡住的地方。

详细信息:对于冗长的问题和无法编译的发布代码,我提前道歉,但我尽量简洁。

问题在于将容器的正确成员映射到函子对象。容器有一个由typelist定义的数组列表,其实现类似于这个

为简单起见,我们假设 typelist 辅助对象TLAlg::length<TL>TLAlg::TypeAt被定义并允许用户分别访问 typelist 的长度和第 N 个类型。

容器类为类型列表(称为字段)中的每种类型分配一个数组,并存储一个指向这些缓冲区的不透明指针。实现类型安全的 getter 以访问特定的字段索引。其实现如下:

我们想要实现一个Functor对象,该对象将使用类型列表的特定子集在卷上应用给定函数。用户不是直接操作数组,而是给出他想要访问的字段的索引列表和要应用的函数的指针。函子对象负责设置正确的参数。

为了提高类型安全性,我们将它们分成两个列表:只读和读/写(读const和非const)。给定的函数原型必须与函子对象的定义一致:代码只有在给定的函数指针与参数定义完全匹配时才能编译,所以我们不必担心类型不匹配。函子的实现是:

如您所见,函子目前没有做任何事情,因为我不知道如何将两个参数包映射到容器数组并将它们绑定到函数指针......

为清楚起见,下面是仿函数类的使用示例:

我尝试了std::forwardstd::bind长时间,但我还没有找到正确的解决方案。可能会考虑替换类型列表,std::tuple但最好保留当前定义。

这段代码可能看起来很奇怪而且不必要地复杂,但它是一个非常简化的大型框架版本,使用这些类是有意义的。

任何帮助将不胜感激。

Yakk的回答澄清:

我确实需要一个类型列表,因为我在其中做了更多的魔法,例如列表的每个元素都可以是一个元组而不是单个类型来关联一个名称。这允许整洁的代码,如:

你可以想象这如何与我想用函子实现的那种操作很好地结合起来。

其次,我明白你为什么对吸气剂感到困惑。正如我最初所说,这是一个非常简化的代码版本,尽管问题很长。在实际程序中,体积是多维的,要么在单个数组中展平,要么在多维数组中分配,这就是 getter 需要完整坐标的原因。这些 getter 有几种不同参数的实现。

最后,Functor 不需要知道将函数应用到哪个元素,因为它本身控制迭代空间并应用预定义的骨架(即模板、波前......)。为了简单起见,我再次省略了它。