Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][Boost]Nietypowa konstrukcja template'a

Ostatnio zmodyfikowano 2014-07-15 00:20
Autor Wiadomość
kampar
Temat założony przez niniejszego użytkownika
[C++][Boost]Nietypowa konstrukcja template'a
» 2014-07-13 18:59:42
Witam, czy ktoś mógłby podzielić się wiedzą na temat takiej konstrukcji:
Point VertexProperties::*
w przykładzie:
C/C++
typedef boost::rectangle_topology <> Topology;
typedef Topology::point_type Point;

struct VertexProperties
{
    VertexProperties() { }
    boost::rectangle_topology <>::point_type point;
    Node * node;
};

typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::directedS, VertexProperties > Graph;
typedef boost::property_map < Graph, Point VertexProperties::*>::type PositionMap;
typedef boost::property_map < Graph, Node * VertexProperties::*>::type NodeMap;
Pierwszy raz się z czymś takim spotykam, mniej więcej domyślam się jak to działa, ale nie wiecie gdzie mogę o takiej składni więcej poczytać?
P-113745
Monika90
» 2014-07-13 20:30:05
Point VertexProperties::*
jest to typ: wskaźnik do składowej typu Point należącej do klasy VertexProperties

Powiedzmy że masz klasę, która ma składowe typu Point:
C/C++
struct VertexProperties
{
    Point p1, p2, p3;
};

To teraz możesz sobie zadeklarwoać zmienną:
C/C++
Point VertexProperties::* p;

i przypisać jej adres jednej ze składowych, np.:
C/C++
p = & VertexProperties::p2;

by wreszcie z użyciem tego wskaźnika odwołać się do składowej konkretnego obiektu:
C/C++
VertexProperties obj;
obj.* p = Point( 3, 4 ); //przypisz do obj.p2
P-113751
DejaVu
» 2014-07-15 00:20:29
Aż musiałem sprawdzić co to jest :P
C/C++
#include <cstdio>

struct Punkt
{
    int x;
    int y;
    Punkt()
        : x( 0 )
         , y( 0 )
    { }
    Punkt( int _x, int _y )
        : x( _x )
         , y( _y )
    { }
};

void wypisz( const char * _sOpis, const Punkt & _punkt )
{
    printf( "%s {%d,%d}\n", _sOpis, _punkt.x, _punkt.y );
}

struct Struktura
{
    Punkt p1, p2, p3;
};

int main()
{
    Punkt Struktura::* wskaznik;
    wskaznik = & Struktura::p2;
   
    Struktura obiekt;
    obiekt.* wskaznik = Punkt( 3, 4 ); //przypisz do obj.p2
    wypisz( "obiekt.*wskaznik", obiekt.* wskaznik );
    wypisz( "obiekt.p2", obiekt.p2 );
    ( obiekt.* wskaznik ).x = 5;
    wypisz( "obiekt.*wskaznik", obiekt.* wskaznik );
    wypisz( "obiekt.p2", obiekt.p2 );
    return 0;
}
Standardowe wyjście programu:
obiekt.*wskaznik {3,4}
obiekt.p2 {3,4}
obiekt.*wskaznik {5,4}
obiekt.p2 {5,4}
P-113809
« 1 »
  Strona 1 z 1