Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当前使用typedef名称。希望不是这个CBitmap:MakeObjGuard类似于MakePair-我希望函数能够推断参数类型并为给定参数生成正确的模板对象(就像MakePair生成std::pair一样)。因此,我必须为MakeXXX函数提供的任何“_C++_Visual Studio 2008_Templates_Mfc_Winapi - Fatal编程技术网

C++ 当前使用typedef名称。希望不是这个CBitmap:MakeObjGuard类似于MakePair-我希望函数能够推断参数类型并为给定参数生成正确的模板对象(就像MakePair生成std::pair一样)。因此,我必须为MakeXXX函数提供的任何“

C++ 当前使用typedef名称。希望不是这个CBitmap:MakeObjGuard类似于MakePair-我希望函数能够推断参数类型并为给定参数生成正确的模板对象(就像MakePair生成std::pair一样)。因此,我必须为MakeXXX函数提供的任何“,c++,visual-studio-2008,templates,mfc,winapi,C++,Visual Studio 2008,Templates,Mfc,Winapi,当前使用typedef名称。希望不是这个CBitmap:MakeObjGuard类似于MakePair-我希望函数能够推断参数类型并为给定参数生成正确的模板对象(就像MakePair生成std::pair一样)。因此,我必须为MakeXXX函数提供的任何“帮助”都需要在其参数列表中,而不是手动选择生成的模板(虽然这可以完成,但它是相反的)。我理解您的问题,但是,使用重载函数指针调用MakeObjGuard时会遇到与调用MakeObjGuard相同的问题。如果编译器不知道参数类型,就无法推断模板类


当前使用typedef名称。希望不是这个CBitmap:MakeObjGuard类似于MakePair-我希望函数能够推断参数类型并为给定参数生成正确的模板对象(就像MakePair生成std::pair一样)。因此,我必须为MakeXXX函数提供的任何“帮助”都需要在其参数列表中,而不是手动选择生成的模板(虽然这可以完成,但它是相反的)。我理解您的问题,但是,使用重载函数指针调用
MakeObjGuard
时会遇到与调用
MakeObjGuard
相同的问题。如果编译器不知道参数类型,就无法推断模板类型。至少目前,我对从您和其他人的帮助中获得的代码感到满意。你会得到最完整答案的官方答案。再次感谢:)好吧,再一次,在这种特殊情况下,不需要强制转换,不管它是否使用typedef。即使没有强制转换,编译器也需要选择适当的重载。
typedef CBitmap * (CDC::* SelectObjectBitmap)(CBitmap*);
SelectObjectBitmap pmf = (SelectObjectBitmap)&CDC::SelectObject;
SelecdtObjectBitmap pmf = &CDC::SelectObject(CBitmap*);
// get our client rect
CRect rcClient;
GetClientRect(rcClient);

// get the real DC we're drawing on
PAINTSTRUCT ps;
CDC * pDrawContext = BeginPaint(&ps);

// create a drawing buffer
CBitmap canvas;
canvas.CreateCompatibleBitmap(pDrawContext, rcClient.Width(), rcClient.Height());

CDC memdc;
memdc.CreateCompatibleDC(pDrawContext);

//*** HERE'S THE LINE THAT REALLY USES THE TYPEDEF WHICH i WISH TO ELIMINATE ***//
ScopeGuard guard_canvas = MakeObjGuard(memdc, (SelectObjectBitmap)&CDC::SelectObject, memdc.SelectObject(&canvas));

// copy the image to screen
pDrawContext->BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &memdc, rcClient.left, rcClient.top, SRCCOPY);

// display updated
EndPaint(&ps);
template <class GDIObj>
ObjScopeGuardImpl1<CDC, GDIObj*(CDC::*)(GDIObj*), GDIObj*> MakeSelectObjectGuard(CDC & dc, GDIObj * pGDIObj)
{
    return ObjScopeGuardImpl1<CDC, GDIObj*(CDC::*)(GDIObj*), GDIObj*>::MakeObjGuard(dc, (GDIObj*(CDC::*)(GDIObj*))&CDC::SelectObject, dc.SelectObject(pGDIObj));
}
ScopeGuard guard_canvas = MakeSelectObjectGuard(memdc, &canvas);
//////////////////////////////////////////////////////////////////////////
//
// AutoSelectGDIObject
//  selects a given HGDIOBJ into a given HDC,
//  and automatically reverses the operation at scope exit
//
// AKA:
//  "Tired of tripping over the same stupid code year after year"
//
// Example 1:
//  CFont f;
//  f.CreateIndirect(&lf);
//  AutoSelectGDIObject select_font(*pDC, f);
//
// Example 2:
//  HFONT hf = ::CreateFontIndirect(&lf);
//  AutoSelectGDIObject select_font(hdc, hf);
//
// NOTE:
//  Do NOT use this with an HREGION.  Those don't need to be swapped with what's in the DC.
//////////////////////////////////////////////////////////////////////////

class AutoSelectGDIObject
{
public:
    AutoSelectGDIObject(HDC hdc, HGDIOBJ gdiobj) 
        : m_hdc(hdc)
        , m_gdiobj(gdiobj)
        , m_oldobj(::SelectObject(m_hdc, gdiobj))
    {
        ASSERT(m_oldobj != m_gdiobj);
    }

    ~AutoSelectGDIObject()
    {
        VERIFY(m_gdiobj == ::SelectObject(m_hdc, m_oldobj));
    }

private:
    const HDC       m_hdc;
    const HGDIOBJ   m_gdiobj;
    const HGDIOBJ   m_oldobj;
};
struct XXX {
    int member() { return 0; }
    int member(int) { return 1; }
};

int main() {     
    int (XXX::*pmfv)(void) = (int (XXX::*)())&XXX::member;
    int (XXX::*pmfi)(int) = (int (XXX::*)(int))&XXX::member;
    return 0;
}
auto pmf = (int (XXX::*)())&XXX::member;
void foo(int){
    std::cout << "int" << std::endl;
}

void foo(float){
    std::cout << "float" << std::endl;
}

int main()
{
    typedef void (*ffp)(float);

    ffp fp = (void (*)(float)) foo; // cast to a function pointer without a typedef

    ((ffp)fp)(0);
}
typedef CBitmap * (CDC::* SelectObjectBitmap)(CBitmap*); 
SelectObjectBitmap pmf = &CDC::SelectObject; 
SelectObjectBitmap pmf = &CDC::SelectObject;