Autor Wątek: [c++] Opengl opakowany w obiekty, czy warto?  (Przeczytany 39597 razy)

Offline ArekBal

  • Użytkownik

# Luty 19, 2014, 12:55:42
I w efekcie funkcje/metody docelowe przyjmują inta zamiast enuma, o którym to zmniejszeniu czytelności właśnie tu mówimy. :)
Możemy jeszcze makro strzelić które schowa rzutowanko. ;)

Nope nope nope. Enum nie jest klasą. Enum jest takim nieco bardziej type-safe intem.
KK pisał o przeładowaniu operatorów.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 19, 2014, 13:22:20
Możemy jeszcze makro strzelić które schowa rzutowanko. ;)
I będzie wyglądało identycznie jak owo rzutowanie. Co to by miało uprościć?

Offline ArekBal

  • Użytkownik

# Luty 19, 2014, 13:27:52
Kolejna alternatywa bez makr i bez inlineowania... za to ze stałymi i bez typesafety,
typedef int DedoFlags;

struct DedoFlag
{
static const int Flaga1 = 1;
static const int Flaga2 = 2;
static const int Flaga3 = 3;
};

DedoFlags Function(DedoFlags flags)
{
return flags;
}

int _tmain(int argc, _TCHAR* argv[])
{
auto flags = Function(DedoFlag::Flaga1 | DedoFlag::Flaga2);

return 0;
}
Przepraszam za wielokrotne edycje... ;)
« Ostatnia zmiana: Luty 19, 2014, 13:41:50 wysłana przez ArekBal »

Offline Xender

  • Użytkownik

# Luty 19, 2014, 14:31:06
KK pisał o przeładowaniu operatorów.
W kontekście enumów. Tylko, że enumy mają wbudowane operatory.

KK - Srsly, użyj normalnych enumów. To nie Java, one nie mają overheadu.

Offline quaikohc

  • Użytkownik

  • +3
# Luty 19, 2014, 15:01:51
W kontekście enumów. Tylko, że enumy mają wbudowane operatory.

Co ty z tymi operatorami do enumow? Jakie niby maja operatory? Ciagle nie rozumiesz: nie mozesz napisac tak:

enum Flags
{
  Flaga1 = 1,
  Flaga2 = 2,
  Flaga3 = 4
};

  Flags a = Flags::Flaga2;
  Flags b = Flags::Flaga3;
  Flags c = a | b; // blad
 Flags c = a + b; // blad
  Flags c = Flaga2 |Flaga3; // blad

Nawet  deklarujac enum tak:
enum class Flags : unsigned int{}
ciagle nie mozesz uzyc powyzszego kodu..

Offline Xender

  • Użytkownik

# Luty 19, 2014, 16:14:59
Ok, winikiem operacji bitowych i arytmetycznych na enum Flags jest <jakiś typ intowy>, a nie Flags - to wszystko wyjaśnia.

Co do enum class - nie "nawet", a "tym bardziej". Enum classy powstały właśnie po to, aby NIE były implicite castowalne DO inta, jak enumy z C.
Oczywiście żadne nie są implicite castowalne Z inta.

Teraz rozumiem, o co chodziło z operatorami - o dziwo przeciążenie (inline lub nie) Flags operator | (Flags, Flags) powoduje segfault na G++ 4.8.2 bez optymalizacji, więc chyba odpada.

#define OR(a, b) (decltype(a)(a | b)) // Raczej niepraktyczne.

Offline quaikohc

  • Użytkownik

# Luty 19, 2014, 16:51:03
Ok, winikiem operacji bitowych i arytmetycznych na enum Flags jest <jakiś typ intowy>, a nie Flags - to wszystko wyjaśnia.

Nie. Again: nie ma operacji bitowych ani arytmetyczncyh na enum Flags. Nie sa zdefiniowane. Nie istnieja.
Twoje makro powinno dzialac dla normalnych enumow, moze nie zainicjowales zmiennych albo cos. Dla claass enumow nie powinno sie skompilowac, bo a i b nie przecastuja sie automatycznie na inty, a (again) nie ma operatora | dla enumow.

W przykladzie z class enum chodzilo o to, ze nawet jezeli oznaczymy typ enuma to i tak to nic zmienia .

Offline quaikohc

  • Użytkownik

# Luty 19, 2014, 16:52:05
(delete this pls)

Offline Xender

  • Użytkownik

# Luty 19, 2014, 17:01:24
@quaikohc - Operacje są dla zwykłych enumów, i je miałem na myśli przez enum Flags. Kompilują się jak najbardziej, g++ 4.8.2, -Wextra -Wall -Weffc++ -pedantic -std=c++1
Jakbym chodziło o enum class, to napisałbym - surprise, surprise - enum class Flags. ;)

Offline quaikohc

  • Użytkownik

# Luty 19, 2014, 17:09:05
@quaikohc - Operacje są dla zwykłych enumów, i je miałem na myśli przez enum Flags.

Chyba sie nie dogadamy... Jakie operacje sa dla zwyklych enumow? Podaj przyklad.

Offline Xender

  • Użytkownik

# Luty 19, 2014, 18:20:23
Kod: (c++) [Zaznacz]
#include <iostream>

using namespace std;

enum Flags
{
        f1 = 1,
        f2 = 2,
        f3 = 4
};

void foo(int f)
{
        cout << (int) f;
}

int main()
{
        foo(f1 + f2);
}
Kod: (bash) [Zaznacz]
% g++ -Wextra -Wall -Weffc++ -pedantic -std=c++11 main.cpp && ./a.out
3
Z bitwise też działa. Tylko, że zwraca jakiś-intowy-typ, a nie typ enuma (w tym wypadku int).

W sumie to nie tyle operatory dla enuma, co implicite cast enum -> int.
« Ostatnia zmiana: Luty 19, 2014, 18:22:17 wysłana przez Xender »

Offline quaikohc

  • Użytkownik

  • +2
# Luty 19, 2014, 19:11:13
W sumie to nie tyle operatory dla enuma, co implicite cast enum -> int.

W koncu...

Offline Xion

  • Redaktor
    • xion.log

  • +1
# Luty 19, 2014, 21:35:31
Cytuj
Zresztą, Xion, już pisałeś na compotach na tym frameworku więc sam powiedz czy warto. :)
Jeśli rysowanie sprite'ów wciąż polega na wielokrotnym użyciu przeciążonego operatora (), w stylu foo()(bar)()(baz) etc., to nie, nie warto ;P

Offline Xender

  • Użytkownik

# Luty 19, 2014, 23:24:56
^ No co, fluent chaining. :P

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 20, 2014, 01:23:59
^ No co, fluent chaining. :P
Raczej eksplozja kombinatoryczna możliwych przeciążeń rysowania sprita - różne sposoby zadawania tekstury, layera, koloru, UVek i pozycji/kształtu. :)