Код шаблона для вызова идентичных API C++ из разных пространств имен. ⇐ C++
-
Гость
Код шаблона для вызова идентичных API C++ из разных пространств имен.
Kubernetes имеет две очень похожие версии CRI API (v1 и v1alpha), определенные здесь:
https://github.com/kubernetes/cri-api/b ... /api.proto https://github.com/kubernetes/cri-api/b ... /api.proto Они преобразуются с помощью protoc в заголовки C++, которые клиенты используют для удаленных вызовов API. Некоторые кластеры Kubernetes поддерживают только v1alpha, некоторые только v1, а некоторые и то, и другое.
Код клиента выглядит следующим образом:
auto stub = runtime::v1::RuntimeService::NewStub(unixSockPath); runtime::v1::ListContainersRequest req; runtime::v1::ListContainersRequest соответственно; заглушка->ListContainers(req, &res); или вот так, в зависимости от того, какая версия поддерживается сервером:
auto stub = runtime::v1alpha::RuntimeService::NewStub(unixSockPath); runtime::v1alpha::ListContainersRequest req; runtime::v1alpha::ListContainersRequest соответственно; заглушка->ListContainers(req, &res); (изменились только названия типов.)
Поэтому клиентам необходимо сначала попробовать использовать v1 и вернуться к v1alpha, если v1 не поддерживается.
Есть ли способ написать функцию шаблона, которая выдает вышеуказанные запросы и использует пространство имен (runtime::v1, runtime::v1alpha) в качестве параметра шаблона ? Это позволит писать такой код:
std::list listContainers() { пытаться { если (g_useV1) return __listContainers(); } catch (const not_supported &ex) { g_useV1 = ложь; } return __listContainers(); } Или передача всех используемых имен типов (RuntimeService::NewStub, ListContainerRequest и т. д.) в качестве параметров шаблона является единственным вариантом?
Kubernetes имеет две очень похожие версии CRI API (v1 и v1alpha), определенные здесь:
https://github.com/kubernetes/cri-api/b ... /api.proto https://github.com/kubernetes/cri-api/b ... /api.proto Они преобразуются с помощью protoc в заголовки C++, которые клиенты используют для удаленных вызовов API. Некоторые кластеры Kubernetes поддерживают только v1alpha, некоторые только v1, а некоторые и то, и другое.
Код клиента выглядит следующим образом:
auto stub = runtime::v1::RuntimeService::NewStub(unixSockPath); runtime::v1::ListContainersRequest req; runtime::v1::ListContainersRequest соответственно; заглушка->ListContainers(req, &res); или вот так, в зависимости от того, какая версия поддерживается сервером:
auto stub = runtime::v1alpha::RuntimeService::NewStub(unixSockPath); runtime::v1alpha::ListContainersRequest req; runtime::v1alpha::ListContainersRequest соответственно; заглушка->ListContainers(req, &res); (изменились только названия типов.)
Поэтому клиентам необходимо сначала попробовать использовать v1 и вернуться к v1alpha, если v1 не поддерживается.
Есть ли способ написать функцию шаблона, которая выдает вышеуказанные запросы и использует пространство имен (runtime::v1, runtime::v1alpha) в качестве параметра шаблона ? Это позволит писать такой код:
std::list listContainers() { пытаться { если (g_useV1) return __listContainers(); } catch (const not_supported &ex) { g_useV1 = ложь; } return __listContainers(); } Или передача всех используемых имен типов (RuntimeService::NewStub, ListContainerRequest и т. д.) в качестве параметров шаблона является единственным вариантом?
Мобильная версия