Toon posts:

[c++] namespaces behouden in using declarations

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb dit in een library zitten:
code:
1
2
3
4
5
6
7
namespace EvdW // namespace die ik gebruik voor mn persoonlijke prut
{
  namespace COM // tooltjes voor COM objecten
  {
    class Wrapper { /* ... */ }; // wrapper om COM objecten heen
  }
}

Nu wil ik in een stuk applicatie-code die COM wrapper kunnen gebruiken als COM::Wrapper. Ik wil dus specificeren dat ik de EvdW::COM::Wrapper bedoel als ik COM::Wrapper zeg.

Ik zou using namespace EvdW; kunnen gebruiken, maar op die manier krijg ik alle prut uit de EvdW namespace in mijn scope, en dat wil ik voorkomen.

Een typedef EvdW::COM::Wrapper COM_Wrapper; doet bijna wat ik wil, maar ook dit vind ik niet echt mooi.

Tot slot is het mogelijk om een extra namespace aan de applicatie-code toe te voegen waarin ik precies structureel per namespace aangeef welke identifiers ik wil gebruiken:
code:
1
2
3
4
5
6
7
8
9
namespace LibraryStuff
{
  namespace COM
  {
    using EvdW::COM::Wrapper;
  }
}

using namespace LibraryStuff;

Dit werkt prima, maar deze manier lijkt me een beetje overkill voor wat ik wil..

Is er misschien een andere mooiere methode om het gewenste effect te verkrijgen, of is dit binnen C++ gewoon niet mogelijk ? En als dit laatste het geval is, zijn jullie het dan met me eens dat dit een zwak punt van het C++ namespace systeem is ?

Verwijderd

Doet
code:
1
namespace COM = EvdW::COM;

niet precies wat je wilt?? Zelf niet getest, maar ik vond zoiets met google..

Verwijderd

Topicstarter
Op donderdag 02 mei 2002 20:11 schreef hondass50 het volgende:
Doet
code:
1
namespace COM = EvdW::COM;

niet precies wat je wilt?? Zelf niet getest, maar ik vond zoiets met google..
Koel !! Doet inderdaad precies wat ik wil, ik kende deze feature niet.

Bedankt :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

werkt gewoon
code:
1
using EvdW::COM;

ook niet?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Op donderdag 02 mei 2002 20:41 schreef .oisyn het volgende:
werkt gewoon
code:
1
using EvdW::COM;

ook niet?
Die werkt idd ook, maar wat is dan het verschil tussen deze oplossing en wat hondass voorstelde ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

nou hondass maakt een namespace alias aan, genaamd COM, die verwijst naar de namespace EvdW::COM

Bij mijn voorbeeld geef je aan dat je de namespace COM wilt gebruiken die zich bevindt in EvdW.

Kwestie van smaak denk ik :) Het nadeel van de suggestie van hondass zou misschien zijn dat je hele ::EvdW::COM namespace ook aanspreekbaar is via ::COM (dus zonder enige using declarations of directives kun je toch via COM bij EvdW::COM komen, en misschien is dat niet wat je wilt)


.edit: poging tot betere uitleg ;)

als je using EvdW::COM; zegt, dan geef je aan dat als je COM gebruikt dat je dan eigenlijk EvdW::COM bedoelt.

als je namespace COM = EvdW::COM; doet dan creeer je een hele nieuwe namespace, die gelijk is aan EvdW::COM


.edit2: oh misschien is dat trouwens niet helemaal waar... je creeert iig een namespace alias, maar ik weet niet of je idd ook een nieuwe namespace creeert.


.edit3: (ja ik blijf aan de gang)
Als COM een klasse zou zijn (en Wrapper dus een inner class van COM), dan werkt mijn voorbeeld nog steeds, maar die van hondass niet (want dan is COM geen namespace meer)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Op donderdag 02 mei 2002 20:47 schreef .oisyn een boel edits ;)
Bedankt voor de uitleg. Ik denk dat ik dan maar voor using EvdW::COM; ga :).

Eigenlijk best logisch dit |:( :D

Verwijderd

Op donderdag 02 mei 2002 21:06 schreef Sneechy het volgende:

[..]

Bedankt voor de uitleg. Ik denk dat ik dan maar voor using EvdW::COM; ga :).
Dit vindt ik idd ook een betere oplossing, wist alleen niet dat je nu nog steeds COM::nogiets kan zeggen (dat kan toch nu), want dat kan dus ook met alleen using EvdW, of maakt het nog verschil als je using namespace of alleen using zegt...hmmm, heb net al te veel ervaring met namespaces en heb ook geen zin compu met VC te starten.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

als je doet
code:
1
using namespace blaat;

dan maak je dus gebruik van alle definities in de namespace blaat staan

als je gewoon doet
code:
1
using blaat::eenVar;

dan maak je dus alleen gebruik van eenVar, die in de namespace blaat staat

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op vrijdag 03 mei 2002 00:05 schreef .oisyn het volgende:
als je doet
code:
1
using namespace blaat;

dan maak je dus gebruik van alle definities in de namespace blaat staan

als je gewoon doet
code:
1
using blaat::eenVar;

dan maak je dus alleen gebruik van eenVar, die in de namespace blaat staat
De zoektermen om hierover in MSDN betere uitleg te krijgen zijn 'Using Directive' (je eerste voorbeeld, inclusief keyword 'namespace') en 'Using Declaration', dat ongespecificeerd gebruik van een specifieke definitie uit een namespace toestaat. Vind persoonlijk wel vreemd dat nested namespaces blijkbaar volgens jullie voorbeelden via de declaration versie gaan, had verwacht dat je daarvoor using namespace EvdW::COM dus als directive zou moeten doen.

Miereneukerij overigens, essentie is dat je alles achter using mag flikkeren ;)

Professionele website nodig?


Verwijderd

Topicstarter
Op vrijdag 03 mei 2002 01:27 schreef curry684 het volgende:

[..]

De zoektermen om hierover in MSDN betere uitleg te krijgen zijn 'Using Directive' (je eerste voorbeeld, inclusief keyword 'namespace') en 'Using Declaration', dat ongespecificeerd gebruik van een specifieke definitie uit een namespace toestaat. Vind persoonlijk wel vreemd dat nested namespaces blijkbaar volgens jullie voorbeelden via de declaration versie gaan, had verwacht dat je daarvoor using namespace EvdW::COM dus als directive zou moeten doen.

Miereneukerij overigens, essentie is dat je alles achter using mag flikkeren ;)
using namespace EvdW::COM; geeft aan dat je als je nu whatever zegt (zonder een namespace te vermelden), dat dat wel eens naar EvdW::COM::whatever zou kunnen verwijzen.

using EvdW::COM; geeft aan dat je als je nu COM::whatever zegt, je naar EvdW::COM::whatever verwijst.

Correct me if i'm wrong

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 03 mei 2002 01:27 schreef curry684 iets over directives en declarations
Sneechy gaf al aan dat hij using namespace EvdW niet wilde gebruiken, omdat hij dan alles uit EvdW kreeg, en hij wilde slechts alleen de COM namespace. Maar dan wel als COM::blaat, en niet gewoon als blaat, dus een using namespace EvdW::COM was ook niet goed geweest

dus vandaar using EvdW::COM :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

misschien een beetje offtopic, maar wat ik echt irritant vind aan nested namespaces is als je variabelen en functies wilt definieren

bijvoorbeeld deze namespace in je header:
code:
1
2
3
4
namespace bla
{
    extern int var;
}

je zou dan ergens in je source file een van deze 2 regels moeten zetten:
code:
1
2
3
4
5
6
int bla::var = 2;
// of
namespace bla
{
    int var = 2;
}

ik geef de voorkeur aan de 2e, vooral als je heel veel variabelen en functies hebt. (Een simpele using namespace bla gaat dan niet werken)

Nou geeft dat echter een probleem als je een nested namespace hebt, zoals deze:
code:
1
2
3
4
5
6
7
8
9
10
namespace bla1
{
    namespace bla2
    {
      namespace bla3
      {
        extern int var;
      }
    }
}

nou heb je 3 opties om je var te definieren (ja eigenlijk wel meer, maar die anderen zijn gewoon weer een andere combinatie):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int bla1::bla2::bla3::var = 2;  // ouch!

// of

using namespace bla1::bla2;
int bla3::var = 2;

// of

namespace bla1
{
    namespace bla2
    {
      namespace bla3
      {
        int var = 2;
      }
    }
}

ik vind dat van die laatste een beetje jammer... je kunt niet gewoon doen
code:
1
2
3
4
namespace bla1::bla2::bla3
{
    int var;
}

waardoor je dus of overal minstens 1 namespace moet zetten, of zo'n hele lijst van nested namespaces opgeven, wat ik persoonlijk erg lelijk vind

weet iemand misschien een betere manier?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Op vrijdag 03 mei 2002 02:10 schreef .oisyn het volgende:
je kunt niet gewoon doen
code:
1
2
3
4
namespace bla1::bla2::bla3
{
    int var;
}

waardoor je dus of overal minstens 1 namespace moet zetten, of zo'n hele lijst van nested namespaces opgeven, wat ik persoonlijk erg lelijk vind

weet iemand misschien een betere manier?
Die namespace a::b { /* ... */ } syntax die je noemt mis ik ook wel eens.

Ik denk echter niet dat een beter alternatief dan namespace a { namespace b { /* ... */ } } beschikbaar is..
Pagina: 1