Pointer NEM Statikus metódusra. probléma

Keresés
Hírlevél
 
ASPC#C++CSSDelphiFlashJavaJavaScriptPascalPerlPHPPythonuniPaaSVisual BasicVisual C++  »    
nyitotta: Perseus, idő: 2012.07.02., moderátor: moderator, megoldás elfogadva: 2012.07.02. 12:10
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben

Kategóriák:Programozási nyelvek » C++

Sorrend:
Időzóna:
Blokkméret:
Oszd meg!
Üdv,
Akadt egy kis problémám a nem statikus metódusokra mutató pointerekkel. DX11-hez készítek egy effekt framework-öt és CreateShader-hez szökségem lenne a két:
ID3D11Device::CreateVertexShader(...);
ID3D11Device::CreatePixelShader(...);
metódus pointerére.
Nos deklaráltam is a sajátjaim:
class Example
{
    HRESULT (__stdcall ID3D11Device::*cVertex)(const void*, SIZE_T, ID3D11ClassLinkage*, ID3D11VertexShader**);
    HRESULT (__stdcall ID3D11Device::*cPixel)(const void*, SIZE_T, ID3D11ClassLinkage*, ID3D11PixelShader**);
public:
    template <class Type>
    HRESULT CreateShader(ID3D11Device* Device, ID3DBlob** ByteCode, ShaderType sType, Type** oBuffer)
    {
        HRESULT Result(S_OK);
        switch (sType)
        {
        case EffectManager::ShaderType::VertexShader:
          cVertex = &ID3D11Device::CreateVertexShader;
          Result = cVertex((*ByteCode)->GetBufferPointer(), (*ByteCode)->GetBufferSize(), 0, &(*oBuffer));
          if (FAILED(Result))
            return Result;

          break;

        // A lényeg látszik mit szeretnék...
     }

     return S_OK;
}
Szóval két gondom van:
1. Ha ilyen módon adok értéket a drága pointernek, azzal lényegében feltételezni szeretném, hogy statikus metódusról van szó, és hát nemtudom meghívni a *Device objektumomon amin kellene.
2. Ha nem így (pedig szerintem nem így) adok értéket a pointereknek, akkor hogy?
Ahhoz, hogy egy nem static metódust meghívjál, igazából két ponter kell:
1. Arra a metódusra egy pointer, amit meg szeretnél hívni. Ez egy úgynevezett pointer-to-member típus, részleteket lásd itt.
2. Arra a példányra egy pointer, amin meg szeretnéd hívni a metódust. Ez egy mezei mutató, esetedben ID3D11Device* típusú.

A C++-ban nincs olyan beépített típus, ami ezt a két mutatót összefogná egybe, de ha szükséged van rá, akkor persze csinálhatsz rá sajátot. előzmény

Hát igen. Ezt a leírást én is olvastam. Az ez alapján készített verzió:
typedef HRESULT (__stdcall ID3D11Device::*cVertex)(const void*, SIZE_T, ID3D11ClassLinkage*, ID3D11VertexBuffer**);

class Example
{
    cVertex Create;
public:
    template <class Type>
    HRESULT CreateShader(ID3D11Device* Device, ID3DBlob** ByteCode, ShaderType sType, Type** oBuffer)
    {
      HRESULT Result(S_OK);
      switch (sType)
      {
        case EffectManager::ShaderType::VERTEX_SHADER:
          Create = &ID3D11Device::CreateVertexShader;
          Result = Device->*Create(...);
          break;

        // omitted...
      }
    }

    return S_OK;
}
A gond ezzel a Result Device->*Create(); -re pedig az, hogy:
error C2064: term does not evaluate to a function taking 4 arguments.
Erre próbáltam rákeresni de nem találtam semmi okosságot . előzmény
Esetleg így:
Result = (Device->*Create)(...);
?

Nem tudom fejből a precedenciákat, de biztosabb, ha többet zárójelezel. előzmény
Jó tényleg, igazad van már nemlátom a fától az erdőt. előzmény
Oszd meg!