Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 19. červenec 2015, 13:53:05 Předmět: konverze z a do POD typu |
|
|
Zdravím,
mám POD typ (říkejme mu neV3 ) reprezentující třísložkový vektor a spoustu funkcí, které ho berou jako parametry nebo vracejí.
Já bych ale rád místo něj používal proměnné typu glm::vec3. Takže potřebuju konverzi oběma směry. glm pochopitelně nechci měnit, takže se nabízí možnost vytvořit neV3::operator glm::vec3() const; a konstruktor neV3(const glm::vec3& v);
ALE je tam háček, a to právě v konstruktoru. POD typy nemohou mít konstruktory.
Jsem v pasti? Musím vytvořit nějakou explicitní funkci to_neV3(glm::vec3)? Nebo je na to nějaký trik?
A abych nezapomněl, nemůžu použít C++11. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 19. červenec 2015, 15:19:50 Předmět: |
|
|
hm a co takto
kód: |
neV3& operator=(const glm::vec3 &d) |
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 19. červenec 2015, 15:56:57 Předmět: Re: konverze z a do POD typu |
|
|
frca napsal: |
Zdravím,
mám POD typ (říkejme mu neV3 ) reprezentující třísložkový vektor a spoustu funkcí, které ho berou jako parametry nebo vracejí.
|
No a jaký je důvod, že to musí být zrovna POD? Jinak sis totiž odpověděl sám  |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 19. červenec 2015, 16:30:51 Předmět: |
|
|
Kvůli použití v unionu (ta knihovna je tak navržená, já jsem ji nepsal). _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 19. červenec 2015, 16:38:44 Předmět: |
|
|
nou napsal: |
hm a co takto
kód: |
neV3& operator=(const glm::vec3 &d) |
|
Nefunguje:
kód: |
// do not change A or C, only B
class A
{
public:
A(float f_) { f = f_; }
float f;
};
class B
{
public:
//B() {}
int i;
B& operator=(const A &a)
{
i = a.f;
return *this;
}
operator A() const
{
return A(i);
}
};
class C
{
union c
{
int i;
B b;
};
};
B compute(const B& b)
{
return b;
}
int main()
{
A a = compute(A(5));
return 0;
}
|
kód: |
../conv_test/main.cpp: In function 'int main()':
../conv_test/main.cpp:44:23: error: invalid initialization of reference of type 'const B&' from expression of type 'A'
A a = compute(A(5));
^
../conv_test/main.cpp:37:3: error: in passing argument 1 of 'B compute(const B&)'
B compute(const B& b)
^
../conv_test/main.cpp:44:7: warning: unused variable 'a' [-Wunused-variable]
A a = compute(A(5));
^ |
_________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 19. červenec 2015, 17:11:57 Předmět: |
|
|
Zkus
kód: |
A a;
a = compute(A(5));
|
Není to asi úplně to, co chceš, ale... |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 19. červenec 2015, 20:04:31 Předmět: |
|
|
Pořád nic...
kód: |
../conv_test/main.cpp: In function 'int main()':
../conv_test/main.cpp:46:21: error: invalid initialization of reference of type 'const B&' from expression of type 'A'
a = compute(A(5));
^
../conv_test/main.cpp:38:3: error: in passing argument 1 of 'B compute(const B&)'
B compute(const B& b)
^ |
Edit: No on je problém v konverzi A -> B, takže dává smysl, že chybová hláška je identická...
A jen pro pořádek, toto taky nefunguje:
kód: |
// do not change A or C, only B
class A
{
public:
A() {}
A(float f_) { f = f_; }
float f;
};
class B
{
public:
//B() {}
int i;
B& operator=(const A &a)
{
i = a.f;
return *this;
}
operator A() const
{
return A(i);
}
};
class C
{
union c
{
int i;
B b;
};
};
B compute(const B& b)
{
return b;
}
int main()
{
A a;
B b = A(5);
a = compute(b);
return 0;
}
|
kód: |
../conv_test/main.cpp: In function 'int main()':
../conv_test/main.cpp:46:14: error: conversion from 'A' to non-scalar type 'B' requested
B b = A(5);
^ |
_________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 20. červenec 2015, 08:28:12 Předmět: |
|
|
Zkoušel jsem a taky mě nic nenapadá. Leda snad udělat nad A ještě nějaký wrapper (pokud A nemůžeš měnit). Na druhou stranu myslím, že explicitní konvertovací funkce vůbec neni na škodu. Když spojuješ dva systémy dohromady, tak je to podle mě i čistší - při psaní si pak snáz uvědomíš, kde se co potkává. Když tu konverzi zabalíš do nějaký statický třídy, tak stejně časem zjistíš, že se ti toto místo hodí i na další funkce.
kód: |
class AB
{
public:
static A ToA(const B &b);
...něco dalšího
}; |
_________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 26. červenec 2015, 23:02:58 Předmět: |
|
|
Nakonec jsem přetížil unární operátor vlnovku. Oproti funkci to má výhodu, že ušetřím jedny závorky. Prostě pragmatická ochcávka. Mnohem jednodušší by bylo vytvořit operátor konverze globálně (jako jsem teď přetížil globálně operátor vlnovka), ale to kdo ví proč v C++ nejde. Blame Stroustrup. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 27. červenec 2015, 08:48:49 Předmět: |
|
|
Neni to trochu prasečinka? :-) Co tím získáš, kromě nepřehlednosti? _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 28. červenec 2015, 21:35:51 Předmět: |
|
|
Je. Když zbyde čas, přetížím všechny existující funkce, aby braly jako parametry / vracely rovnou glm typy. Tím se to vyřeší. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 29. červenec 2015, 07:32:50 Předmět: |
|
|
No, nevím sice, jaký přesně kód máš, ale přetěžovat všechny ty funkce, to taky neni ideál. Zvětšíš tim provázanost knihoven, možná přidáš nějakou tu chybu a zošklivíš interface. Raději to odděl architektonicky (třeba nějaký pojítko, nebo wrapper) a normálně ty typy konvertuj. Neni na tom opravdu nic zlého a zpoždění při konverzi je prakticky neměřitelné. Pokud to bude udělané dobře, tak nakonec zjistíš, že tu konvertovací funkci potřebuješ jen na málo místech.
Co jsem napsal, ber s rezervou. Představuju si to totiž podobně, jako když jsem svůj fyzikální systém rouboval na bullet a kolegův engine ;-). _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
|