C ++ Переменное число параметров шаблона переменной - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующий псевдоним типа:

using VoidFunc = void (*)();

Я хотел бы определить класс следующим образом:

class SomeClass {
public:

 template<template<typename Return, typename... Args>... Funcs>
 static constexpr typename std::vector<VoidFunc> registerFunctions(Funcs<Return, Args...>... funcs) {
  return { ((VoidFunc)(funcs), ...) };
 }
};

Я знаю, что это неверный синтаксис, как Return и Args неразрешимы вне их группы шаблонов.Цель состоит в том, чтобы позволить функции registerFunction принимать переменное число функций с разными прототипами.В реальной реализации важно сохранить информацию о типе каждой функции для использования с другими constexpr функциями.Есть ли способ достичь этого в C ++ 17 или более поздней версии?

1 Ответ

0 голосов
/ 07 февраля 2019

На самом деле вас не волнует ни один из этих базовых типов (по крайней мере, в коде, представленном здесь).Так что просто не используйте его.Все, что вас волнует, это то, что все эти вещи являются указателями на функции:

typename <typename... F>
static std::vector<VoidFunc> registerFunctions(F*... funcs)
{
    static_assert((std::is_function_v<F> && ...));
    return { reinterpret_cast<VoidFunc>(funcs)... };
}

Если вам нужно нужны подписи для чего-то еще, вы можете просто передать каждый элемент funcs вдругой шаблон функции и просто переведите туда собственно сигнатуру.

Обратите внимание, что typename там не нужен, а constexpr в C ++ 17 делает это неправильно (так как вы не можете в C ++ 17 иметь constexpr std::vector).

...