cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Притягивание области видимости #118

Open Neargye opened 3 years ago

Neargye commented 3 years ago

Перенос предложения: голоса +0, -3 Автор идеи: LevSch

Позволяет сделать язык более лаконичным за счёт отсутствия необходимости использования оператора расширения области видимости "::" в некоторых случаях.

На текущий момент называю это scope pulling.

Далее пример, из которого, полагаю/надеюсь, всё будет очевидно.

В примере два варианта притягивания:

  1. очевидный

  2. указанный при описании агрумента функции

include

include

include

namespace myspace {

typedef std::vector ByteBuffer;

enum class LogType { debug, info, fatal, error, };

void log(LogType logType,const std::string& str) { (void)logType; // ... std::cout << str << std::endl; }

namespace app_resources { // some generated ids (некоторые сгенерированные системой сборки идентификаторы) namespace pictures { static inline const int logo = 1; static inline const int monaLisa = 2; } namespace binaries { static inline const int defaultSqLite = 3; } } ByteBuffer readResource(int resourceId) // current solution (текущее решение) { (void)resourceId; // ... return ByteBuffer(); }

// ByteBuffer readResource(int resourceId pullscope app_resources); // proposed solution (предлагаемое решение)

void sandbox() { // scope pulling (притягивание области видимости) { // obvious (очевидное) { log(LogType::debug,"Log1"); // current solution (текущее решение) // log(debug,"Log1"); // proposed solution (предлагаемое решение) } // declared (указанное) { readResource(app_resources::pictures::monaLisa); // current solution (текущее решение) // readResource(pictures::monaLisa); // proposed solution (предлагаемое решение) } } }

}

int main() { myspace::sandbox(); return 0; }

Neargye commented 3 years ago

yndx-antoshkka 9 августа 2019, 11:39 Выглядит действительно хорошо, но есть очень большие проблемы. В данный момент выбор функции работает в обратную сторону:

1) формируется список доступных перегрузок из текущего namespace и всех namespace аргументов (ADL)

2) по типам аргументов выбирается лучшая перергрузка из списка из шага 1)

То есть ваше предложение несовместимо с текущей работаой C++.

Можно несколько упростить верхнюю схему, например если namespace явно указан, то ADL не происходит. Это решит проблему с формированием списка на шаге 1), но как выбрать лучшую перергрузку на шаге 2) - не очень понятно, т.к. типы аргементов неизвестны до тех пор, пока мы не выберем функцию.

LevSch 9 августа 2019, 14:13 Упростить верхнюю схему это так

myspace::log(debug,"Log1");

вместо

log(debug,"Log1");

?

Тогда не вижу смысла. Так как в одном месте убрали буквы, а в другом добавили.

Если функция одна, то неоднозначности, ведь, не может быть. Если так, то я согласен на одну (для начала).