Здравствуйте, jyuyjiyuijyu, Вы писали:
J>как мне сделать видимым эту функцию только в классе чтоб обращаться к ней можно было не указывая J>неймспейсы постоянно
1. using declaration/directive, namespace alias могут быть внутри функций:
#include <cmath>
int main()
{
using std::sin;
namespace s = std;
using namespace std;
}
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>да это похоже меньшее из зол...
J>но странно что не существует простого способа добавить имя marshal_as в неймспейс класса...
Тут возникает ряд тонких вопросов, ответы на которые не очень очевидны. Когда мы используем using declaration или using directive в каком-либо пространстве имен, мы тем самым добавляем в это пространство имен новые имена и делаем их доступными через это пространство имен так, как-будто они в нем определены:
namespace ns1 {
using namespace ns2; // using directiveusing ns3::foo; // using declaration
} // namespace ns1
. . .
// somewhere below:
ns1::foo();
ns1::bar(); // bar became from ns2
А вот теперь, что если вместо пространства имен ns1 мы использует класс (структуру)? Как должны сочетаться друг с другом имена, веденные из из базовых классов и из внешних пространств имен? Должны ли они быть видны за пределами структуры, как это было в случае с пространством имен? Если мы разрешаем использование директивы using (импорт всего пространства имен) для пространств имен, то почему не разрешаем для базовых классов? Как управлять спецификацией доступа к введенным именам (private/propected/public)? Если можно импортировать имена из пространства имен в класс, то, наверное, можно импортировать имена из класса в пространство имен? Также возникают некоторые вопросы, касающиеся ADL. Я думаю, что просто эти возможности сочли не очень востребованными и не очень критичными и предпочли не заморачиваться поиском ответов на подобные вопросы.
--
Не можешь достичь желаемого — пожелай достигнутого.
J>struct test
J>{
J> using std::string;
J> void f(const string& var)
J> {
J> }
J>};
J>
J>как быть ?
Прямо вроде как нельзя, но можно попробовать слегка хаккернуть...
namespace using_std {
using namespace std;
struct test
{
void f(const string& var)
{
}
};
}
using using_std::test;
test().f( "bla-bla-bla" );
J>спасибо
Для "спасибо" тут есть кнопки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, rg45, Вы писали:
R>Если можно импортировать имена из пространства имен в класс, то, наверное, можно импортировать имена из класса в пространство имен? Также возникают некоторые вопросы, касающиеся ADL. Я думаю, что просто эти возможности сочли не очень востребованными и не очень критичными и предпочли не заморачиваться поиском ответов на подобные вопросы.
Если честно, мне не ясно, почему в С++ вообще нельзя управлять видимостью имён в частности и составом скоупов вообще. Почему всё делается как-то хитро-неявно? Зачем это всё надо? Я не понимаю...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
R>>Если можно импортировать имена из пространства имен в класс, то, наверное, можно импортировать имена из класса в пространство имен? Также возникают некоторые вопросы, касающиеся ADL. Я думаю, что просто эти возможности сочли не очень востребованными и не очень критичными и предпочли не заморачиваться поиском ответов на подобные вопросы.
E>Если честно, мне не ясно, почему в С++ вообще нельзя управлять видимостью имён в частности и составом скоупов вообще. Почему всё делается как-то хитро-неявно? Зачем это всё надо? Я не понимаю...
Мне сложно сказать, послушать бы того, кто это проектировал. Вероятно, они рассматривали какие-то юзкейсы, пытались предотвратить какие-то сложности...
--
Не можешь достичь желаемого — пожелай достигнутого.