好的,这只是一个小小的警告.我目前正在与ESRI的可爱ArcSDK合作.现在要从任何函数中获取值,您基本上必须传递变量,您想要将值赋值给.
例如:
long output_width;
IRasterProps->get_Width(&output_width);
Run Code Online (Sandbox Code Playgroud)
这是一件小事,但是当你必须从他们的各种功能中挑出大约30个不同的数据时,它真的开始变得烦人.
所以我想知道是否有可能以某种方式通过STL或C++的魔力将其转换为:
long output_width = IRasterProps->get_Width(<something magical>);
Run Code Online (Sandbox Code Playgroud)
所有函数都返回void,否则它们中的一些可能会返回一个HRESULT,我可以放心地忽略它.有任何想法吗?
***编辑****
继承了我得到的最终结果:)!!!!!
A magic(P p, R (__stdcall T::*f)(A *)) {
A a;
((*p).*f)(&a);
return a;
}
Run Code Online (Sandbox Code Playgroud)
我知道我已经回答了,但这是另一种方式.它更好,因为它更快(没有boost ::函数开销)并且避免了绑定器(因为人们似乎厌恶它们),但更糟糕的是它不那么通用(因为它只适用于单参数成员函数) ).
template <typename P, typename T, typename A>
A magic(P p, void (T::*f)(A &)) {
A a;
((*p).*f)(a);
return a;
}
Run Code Online (Sandbox Code Playgroud)
您可以这样称呼:
long output_width = magic(raster_props_object, &IRasterProps::get_Width);
Run Code Online (Sandbox Code Playgroud)
或者,如果您碰巧使用GCC,我们可以使用更多技巧:
#define MORE_MAGIC(p,f) ({ \
typedef __typeof(*(p)) big_ugly_identifier; \
magic((p),(&big_ugly_identifier::f)); \
})
Run Code Online (Sandbox Code Playgroud)
这将让我们这样做:
long output_width = MORE_MAGIC(raster_props_object, get_Width);
Run Code Online (Sandbox Code Playgroud)
(如果命名约定让您想到PDP-10,则可获得奖励.)
编辑:更新以采用任何类似指针的类型,因此它现在将使用shared_ptr,迭代器,并希望_com_ptr.
编辑:哎呀,他们是指针,而不是参考.这是一个处理它的版本(或重载),并允许 - 通过忽略 - 任意类型的返回值.
template <typename P, typename T, typename A, typename R>
A magic(P p, R (T::*f)(A *)) {
A a;
((*p).*f)(&a);
return a;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |