我用过std::mem_fn和std::bind用于反射样式属性.
所以我会有class SomeClass一个矢量AbstractProperty.可以有几种不同类型的类AbstractProperty,例如PropertyFloat,PropertyU32等
然后,在SomeClass我会bind到std::function了AbstractProperty.我愿意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)
当然,类型可以使用模板并且更通用,但这取决于您正在开发的内容.
通常,使用成员函数进行回调可能会非常麻烦,例如在<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)
(好吧,愚蠢的例子,但我现在想的就是.)
| 归档时间: |
|
| 查看次数: |
6637 次 |
| 最近记录: |