mem_fn和bind的一些实际用途

Fan*_*c23 8 c++ tr1 mem-fun stdbind

有人可以推荐tr1的mem_fn和绑定工具的一些很酷的实际用途吗?我不需要深奥的c ++用于库开发.只是一些使用这些的应用程序级编码.

任何帮助将非常感激.

jos*_*mas 6

我用过std::mem_fnstd::bind用于反射样式属性.

所以我会有class SomeClass一个矢量AbstractProperty.可以有几种不同类型的类AbstractProperty,例如PropertyFloat,PropertyU32

然后,在SomeClass我会bindstd::functionAbstractProperty.我愿意bind这样做

std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)
Run Code Online (Sandbox Code Playgroud)

对于setter类型函数,我会使用

 std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)
Run Code Online (Sandbox Code Playgroud)

当然,将函数设置为类更难,但我确实使用了std::function这样做.在PropertyFloat我有

typedef std::function<float(void)> GetterType;
Run Code Online (Sandbox Code Playgroud)

所以它通过一个函数设置它,我会传递std::bind我作为参数显示的第一个

typename PropertyFloat::GetterType getter
Run Code Online (Sandbox Code Playgroud)

当然,类型可以使用模板并且更通用,但这取决于您正在开发的内容.


Som*_*ude 5

通常,使用成员函数进行回调可能会非常麻烦,例如在<algorithm>函数中使用.std::mem_fn(它现在已标准化,因此您不再需要使用tr1命名空间)创建一个可调用对象,可用作这些函数的仿函数对象.供其使用的一个例子,请参见实施例部分此链接它使用std::string::size.

std::bind可以在例如编译时不知道实际参数时使用,但必须使用参数runtime创建一个可调用对象.它也可以用于重新排序参数,例如:

auto f1 = std::bind(printf, _2, _1);
f1(42, "%d\n");
Run Code Online (Sandbox Code Playgroud)

(好吧,愚蠢的例子,但我现在想的就是.)