Open Neargye opened 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");
?
Тогда не вижу смысла. Так как в одном месте убрали буквы, а в другом добавили.
Если функция одна, то неоднозначности, ведь, не может быть. Если так, то я согласен на одну (для начала).
Перенос предложения: голоса +0, -3 Автор идеи: LevSch
Позволяет сделать язык более лаконичным за счёт отсутствия необходимости использования оператора расширения области видимости "::" в некоторых случаях.
На текущий момент называю это scope pulling.
Далее пример, из которого, полагаю/надеюсь, всё будет очевидно.
В примере два варианта притягивания:
очевидный
указанный при описании агрумента функции
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; }