初始化和分配值,从引用传递

Ube*_*per 4 c++

好的,这只是一个小小的警告.我目前正在与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)

me2*_*e22 7

我知道我已经回答了,但这是另一种方式.它更好,因为它更快(没有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)