Задать вопрос

Возможно ли достичь аргумента с нескольким определением типа?

В С++ не хватает определения функций с множественным типом аргумента. Может это как то можно по другому написать?

псевдокод

inline PFN_vkVoidFunction vulkanGetProcAddress(const VkInstance & device, const std::string & name) {return vkGetInstanceProcAddr(device, name.c_str());}
        inline PFN_vkVoidFunction vulkanGetProcAddress(const VkDevice & device, const std::string & name) {return vkGetDeviceProcAddr(device, name.c_str());}

|
|
|
^

 inline PFN_vkVoidFunction vulkanGetProcAddress(const [VkInstance | VkDevice] & device, const std::string & name) {return


Можно попробовать добавить через метарасширения путем модернизации компилятора llvm, но я не умею, если знаете - можете подсказать, желательно с примерами.
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Простой 10 комментариев
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Конкретно в вашем случае нет нужды извращаться, перегрузка функций — самое лучшее.

А так здесь есть два вопроса.
1. А что напишем в скобках вместо непонятного return?
2. В какой код оно должно скомпилироваться?

Пример стандартный шаблонный.
template <class Device>
SomeFunction getProcAddress(const Device& device, const std::string& name);

template <>
inline SomeFunction getProcAddress<VkInstance>(
        const VkInstance& device, const std::string& name)
  { return vkGetInstanceProcAddr(device, name.c_str()); }


Это стандартное использование шаблонов Си++ с далёкого 1998 года.

Пример через if constexpr. Си++17, значит.
template <class Device>
inline SomeFunction getProcAddress(const Device& device, const std::string& name)
{
  if constexpr (std::is_same_v<Device, VkInstance>) {
    return vkGetInstanceProcAddr(device, name.c_str());
  } else {
    // false нельзя! — проверка произойдёт в любом случае, будет компилироваться ветка или нет.
    static_assert(std::always_false_v<Device>, "Unknown type");
  }
}

Используется в функции std::visit, чтобы исполнить разный код для разных вариантов std::variant и ничего не забыть.

Что написано в скобках — ну, сами видите. Во что скомпилируется — в две разных функции.

В некоторых случаях — вероятно, не в вашем — можно ещё поиграться с виртуальным полиморфизмом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы