Pull to refresh
4
0
Send message

Как альтернативу dns Resolver в k8s можно использовать kuberesolver как легковесное решение без дополнительных sidecar-ов при использование Istio с xDS

Отличная статья! В реализации от gRPC updateSubConnState записывается в опцию при создания sc, в вашей же реализации функция являться частью интерфейса Balancer, не знаете с чем связано это изменение? Так же вопрос, для каких целей может понадобиться свой Balancer отличающийся от base.Balancer, в ум приходят лишь ситуации когда требуется передать Picker что-либо кроме connectivity.Ready SubConn? Возможно стоит добавить в статью описание стейтов из connectivity, чтобы вся эта Стейт машина, которую прийдется реализовывать в своем Balancer, была более понятной :)

Это хороший вопрос, на него у меня ответа нету :)


Наверное у меня работает наоборот, я это все намудрил потому что хочу видеть Objective-C API исключительно в свойственной для него среде (Objective-C). И использовать Objective-C++ чисто как адаптер между Objective-C и C++.

Да и скорее всего когда человек отркывает .m файл он наверное ожидает видеть там Objective-C код а не Си с вызовами Objective-C API (Тоже самое и с Objective-C++ и С++).

Реальной кодовой базы с примерами подобных патеров у меня нету, по этому это исключительно мое собственное мнение и видиние

Я кажется вас понял :), это я для примера все в один mm засунул, в реальности есть еще хедер в котором интерфейс уже (Objective-C) класса, и .m файл с implementation

Давайте разберемся, может я вас не правильно понял. У меня есть хэдер файл который должен печатать строчку следующим образом:
1) Для Linux должна быть реализация которая вызывает std::cout
2)Для MacOS соответственно NSLog
3)Реализация должна хранить в себе поле (std::string, NSString соответсвенно)

Этот хедер вызывается из с++ кода (который должен работать и на Linux и на macOS)

Ограничения:
Linux абсолютно не может компилировать Objective-C/Objective-C++ код
Никаких #ifdef APPLE, все решается на этапе сборки (Как в файле ниже, не важно Make, CMake)
Makefile:

UNAME := $(shell uname)
ifeq ($(UNAME), Darwin)
  printer_source := printer.mm
else
  printer_source := printer.cpp
endif

printer.o: $(printer_source)
  ...

bin: ... printer.o
  ...

Как ваш код решит такую проблему ? (как по мне достаточно классическая проблема для кросплатформенного кода который использует Apple SDK)

Опять таки, ваше решение не подходит для поставленной мною задачи: Мне нужно чтоб код который написаный на С++ мог использовать Objective-C в macOS среде для определенного хєдера, и c++ в Linux среде (Там где нету доступа к Objective-C и AppleSDK) для того же хєдера. Если я перепишу весь проект на .mm файлы он не соберется на линуксе.

Так получаем код который могут сопровождать разработчики которые знают C++, а objc не очень

Мне наоборот кажется что мое решение очень хорошо разграничивает C++ и Objective-C, так как:
1) Objective-C имплементация полностью инкапсулирована PIMPL-ом
2) Это код который может собирается отдельным обьектником (библиотекой если там много файлов)

Я имею ввиду что в системе которой нету Objective-C ваша программа не скомпилируется: ```gcc: fatal error: cannot execute ‘cc1obj```, а моя (если я ей скажу) чтобы вместо .mm для macOS, я использовал какой-то другой .cpp, для одного и того же хедера - скомпилируется.

Только если использовать 2 разных main для Linux (main.cpp и другой принтер .cpp) для macOS (main.mm и принтер .mm)

К вашему примеру и не придерешься, но все таки тут немного другая суть, из-за ARC получается что мы используем С++ в Objective-C, а у меня стояла задача именно Objective-C в С++. Что я конкретно имею ввиду: Если у меня сборка под macOS, я нахожу компилятор objective-C и линкую Objective-C обьектник, если же под Линукс (к примеру) то я даже не думаю про Objective-C, а просто забиваю на компиляцию данного обьектника и использую какой-то другой. В вашем же примере мне и под MacOS и под Linux, стоит иметь Objective-C, да и проект становится написанным на Objective-C а не на С++ по факту.
Но ваш пример определенно красивый.

Хех, а с шаблонной магией и forwarding ссылками вообще красота). Мне кажется что любая статья где хоть как-то участвует с++, сводится к какому-то недопониманию и непринятию :), в том числе это и тема оптимизации. Эх **неуверено говорит** раньше было лучше (и добавляет флаг std=c++20) :)

Спасибо, да, примерно так я себе и представлял класс, после того как начал изучать вопрос по вашим референсам.

Практическое применение второго конструктора с rvalue, все же есть, но наверное оно больше для того чтобы показать что вызывающая сторона больше не владеет обьектом. В класических примерах я бы все таки рассчитывал на оптимизации (такие как Copy elision).

Спасибо за источники (будут обязательные к прочтению :) ), ваше замечание с release абсолютно коректно

А что если я на вход передам lvalue и эта строка будет потом использоваться в других объектах и классах (везде ее перемещать?), напоминаю, перемещение Не бесплатно.

Спасибо за развернутый комментарий! На счет С++, я с вами согласен, но частично. Углубляться в тему ссылок и перемещения можно вечно и дискуссия не потухнет еще долго, оставлю лишь ссылку на отличный материал по этой теме http://scrutator.me/post/2018/07/30/value_vs_reference.aspx (тут каждый делает выводы сам, очевидного ответа там нету).
На счет интерфейса класса я с вами согласен, что было б правильней передавать аргумент сообщения напрямую в Print, но я хотел свести все к "финальной версии", где у нас должно существовать именно поле которое является обьектом Objective-C и функции которые должны взаимодействовать с этим полем, по этому пример и не совсем правильный по дизайну.

На счет, управлением памяти, вы действительно правы и ваше предложение с retain действительно имеет место быть. Но указателем на PrinterImpl, теоретически владеть кто-то еще может, но фактически он под unique_ptr, что означает если ты достаешь от туда сырой указатель unique_ptr::get() то ты получишь "не владеющий" указатель, unique_ptr для того и создан чтобы не было двух владеющих указателей на один участок памяти.
Среду с автоматическим подсчетом ссылок я действительно не брал в расчет, так как подразумевал что С++ классы будут вызываться и использоваться только в среде С++, когда я писал статью я не рассматривал что другой Objective-C++ код будет их использовать.

Смотря что вы имеете ввиду под проблемами. Использовать С++ код в Objective-C можно без проблем, это будет, как вы и написали, Objective-C++. А если стоит задача использовать Objective-C++ в существующем C++ коде, то тогда уже появляются проблемы описание в статье.

Information

Rating
Does not participate
Registered
Activity