Квалификация пространства имен в объявлении класса
От: FreshMeat Россия http://www.rsdn.org
Дата: 05.10.05 13:46
Оценка:
Приветствую!

Есть класс
namespace my_lib
{
class Foo
{

private:
    std::container<int> m_var0;
    lib::class2         m_var1;
    jet_another_lib::indispensable m_var2;
};
}

Все прекрасно работает, но выглядит явная квалификация пространства имен перед каждой переменной как-то неизяшно.
Душа просит чего-то наподобие:
class Foo
{
using namespace std;
using lib::class2; 
using jet_another_lib::indispensable;
//...
private:
    container<int> m_var0;
    class2         m_var1;
    indispensable  m_var2;
};
}


Вопрос — есть какой-либо способ красиво, не используя using-директиву перед объявлением класса, получить доступ к содержимому используемых пространств имен?

Спасибо.
Хорошо там, где мы есть! :)
Re: Квалификация пространства имен в объявлении класса
От: Аноним  
Дата: 05.10.05 14:25
Оценка:
Здравствуйте, FreshMeat, Вы писали:

FM>Приветствую!


FM>Есть класс

FM>
FM>namespace my_lib
FM>{
FM>class Foo
FM>{

FM>private:
FM>    std::container<int> m_var0;
FM>    lib::class2         m_var1;
FM>    jet_another_lib::indispensable m_var2;
FM>};
FM>}
FM>

FM>Все прекрасно работает, но выглядит явная квалификация пространства имен перед каждой переменной как-то неизяшно.
FM>Душа просит чего-то наподобие:
FM>
FM>class Foo
FM>{
FM>using namespace std;
FM>using lib::class2; 
FM>using jet_another_lib::indispensable;
FM>//...
FM>private:
FM>    container<int> m_var0;
FM>    class2         m_var1;
FM>    indispensable  m_var2;
FM>};
FM>}
FM>

FM>
FM>Вопрос — есть какой-либо способ красиво, не используя using-директиву перед объявлением класса, получить доступ к содержимому используемых пространств имен?

не хочешь? вот тебе изврат, который на самолм деле НЕ ЭКВИВАЛЕНТЕН:


class my_lib {
public:
    class Foo {
    public:
        void SetY(int val){y=val;}
        int y;
    };
};


class CClient: public my_lib{    
public:
    void DoSmth(){
        x.SetY(5);
        g.SetY(8);
        printf("%d\n",x.y);
        printf("%d\n",g.y);
    }
private:
    Foo x;  
    Foo g;
};


шутю Ж-)
Re: Квалификация пространства имен в объявлении класса
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.10.05 14:34
Оценка: 1 (1)
Здравствуйте, FreshMeat, Вы писали:

FM>Есть класс

FM>namespace my_lib
FM>{
FM>class Foo
FM>{

FM>private:
FM>    std::container<int> m_var0;
FM>    lib::class2         m_var1;
FM>    jet_another_lib::indispensable m_var2;
FM>};
FM>}

FM>Все прекрасно работает, но выглядит явная квалификация пространства имен перед каждой переменной как-то неизяшно.
FM>Душа просит чего-то ...

Она просит typedef-ов определенных в рамках класса. Это факт — я с ней как-то по-душам поговорил

class Foo
{
 private:
  typedef std::container<int>            container_type;
  typedef lib::class2                    class2_type;
  typedef jet_another_lib::indispensable indispensable_type;

  container_type      m_var0;
  class2_type         m_var1;
  indispensable_type  m_var2;
};//class Foo
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Квалификация пространства имен в объявлении класса
От: Глеб Алексеев  
Дата: 05.10.05 14:36
Оценка: 12 (1)
Здравствуйте, FreshMeat, Вы писали:

FM>Вопрос — есть какой-либо способ красиво, не используя using-директиву перед объявлением класса, получить доступ к содержимому используемых пространств имен?


Навскидку ничего умнее чем
namespace detail {
using namespace x;
using namespace y;
using z::foo;

class bar {
...
};
}
using detail::bar;

не приходит в голову.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Квалификация пространства имен в объявлении класса
От: FreshMeat Россия http://www.rsdn.org
Дата: 05.10.05 14:53
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Навскидку ничего умнее чем

ГА>
ГА>namespace detail {
ГА>using namespace x;
ГА>using namespace y;
ГА>using z::foo;

ГА>class bar {
ГА>...
ГА>};
ГА>}
ГА>using detail::bar;
ГА>

ГА>не приходит в голову.

Спасибо, интересная идея
Хорошо там, где мы есть! :)
Re[2]: Квалификация пространства имен в объявлении класса
От: FreshMeat Россия http://www.rsdn.org
Дата: 05.10.05 14:53
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Она просит typedef-ов определенных в рамках класса. Это факт — я с ней как-то по-душам поговорил

КД>...
Угук, единственное решение, которое в голову приходило, но его использование с шаблонами не шибко красиво выглядит.
Хорошо там, где мы есть! :)
Re[3]: Квалификация пространства имен в объявлении класса
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.10.05 15:03
Оценка: 6 (1)
Здравствуйте, FreshMeat, Вы писали:

КД>>Она просит typedef-ов определенных в рамках класса. Это факт — я с ней как-то по-душам поговорил

КД>>...
FM>Угук, единственное решение, которое в голову приходило, но его использование с шаблонами не шибко красиво выглядит.

Я предпочитаю использовать символьные имена от typedef-ов, ибо они могут быть гораздо меньше, чем шаблоны с параметрами. Итераторы потом упаришься определять.

Опять же, смотришь на секцию класса с typedef-определениями и видишь, что ему для жизни надо
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Квалификация пространства имен в объявлении класса
От: FreshMeat Россия http://www.rsdn.org
Дата: 05.10.05 15:19
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД> Я предпочитаю использовать символьные имена от typedef-ов, ибо они могут быть гораздо меньше, чем шаблоны с параметрами. Итераторы потом упаришься определять.

Это безусловно. Минус вот где — если используется несколько псевдонимов в одном хедере, например для map, vector, auto_ptr, имхо, код становится затруднительным для понимания (чем больше typedef, тем запущеннее ситуация).

КД>Опять же, смотришь на секцию класса с typedef-определениями и видишь, что ему для жизни надо

<из внешних пространств имен>
Интересная идея
Хорошо там, где мы есть! :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.