Обнаружение, существует ли специализация шаблона функции, и возвращение указателя функции на действительную реализациюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обнаружение, существует ли специализация шаблона функции, и возвращение указателя функции на действительную реализацию

Сообщение Anonymous »

У меня есть проект, в котором я использую шаблоны функций, чтобы позволить пользователям обмениваться специализациями по функциям во время компиляции, поэтому в библиотеке общего кода по умолчанию есть версия по умолчанию и дополнительная специализация, предоставленная пользователем для конкретного подпроекта. Линии: < /p>

Код: Выделить всё

#include 

using FunctionPtr = void (*)();

// Primary template
template
void demo() = delete;

// The common code default implementation
template
void demo() { };

// Detect if a specialization exists
template
concept has_demo = requires { demo(); };

static_assert(has_demo);
static_assert(!has_demo); // False - no user-provided specialization.
< /code>
Мне в конечном итоге нужно сохранить фактический указатель функции разрешенной функции в таблице диспетчеры Вулкана, поэтому я пытаюсь написать функцию разрешения, которая возвращает специализацию, если она существует, и не иначе: < /p>
constexpr FunctionPtr getPointer(void)
{
if constexpr(has_demo)
{
return demo;
}

return demo;
}
... что впоследствии жалуется на то, что демо достигает удаленного шаблона (что правда, он не существует, потому что пользователь не предоставил его).
Я знаю, что я могу поддержать это, не удаляя версию по умолчанию и не давая версию, но это можно проверить, но это можно проверить, но это можно проверить, но это можно проверить, но это можно проверить. «Истинная» черта для каждой специализации функции, которую они предоставляют, что является худшим опытом пользователя с точки зрения пользователям, которые должны писать больше кода. Есть ли способ избежать этого?

Подробнее здесь: https://stackoverflow.com/questions/797 ... a-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»