Получите пакет параметров из аргумента переменной

#c

Вопрос:

Я пытаюсь получить пакет параметров из списка аргументов, переданных макросу.

 templatelt;std::size_t N, class T, class... Tsgt;  constexpr bool myFunctionHelper(const char (amp;fmt)[N], std::size_t n);  template lt;std::size_t N, typename... Tsgt; constexpr bool myFunction(const char (amp;fmt)[N]) {  return myFunctionHelperlt;N, Ts...gt;(fmt, 0); }  #define FNC(fmt, ...)    do {    static_assert(myFunctionlt;sizeof(fmt), decltype...(__VA_ARGS__)gt;(fmt),   "Incorrect arg types");   } while (false)   

Но decltype работает не так, как указано выше (хотя sizeof работает). Есть ли какой-то способ получить пакет параметров?

Это работает, если я передаю аргументы в функцию myFunction и позволяю компилятору вывести тип шаблона, но я не могу передать аргументы дальше. аргументы не обязательно должны быть constexpr.

Редактировать:

decltype(arg) дает нам тип аргумента для любого объекта. Здесь я пытаюсь получить информацию о типе нескольких аргументов в качестве пакета параметров. Если я использую decltype(__VA_ARGS__) , сборка завершится успешно, но она просто даст мне тип последнего параметра в __VA_ARGS__ . Например:

 decltype(1, "test", 4.0)  

это переводилось бы как «просто float «.

Там не существует ничего подобного decltype...(args) ( sizeof...(__VA_ARGS__) хотя и существует).

FNC будет использоваться следующим образом

 FNC("%d, %s, %0.2fn", 1, "test", 4.0);  

Комментарии:

1. Пожалуйста, укажите, как именно это не работает. Если он не компилируется, пожалуйста, опубликуйте дословное сообщение об ошибке. Кроме того, покажите пример того, как вы используете FNC .

2. Похоже, вы рассчитываете decltype...(1, 2, 3) расшириться до int, int, int . Вместо этого это синтаксическая ошибка: нет такого понятия, как decltype... . Вам придется перейти __VA_ARGS__ к myFunction аргументам в качестве аргументов и разрешить выводить их типы.

Ответ №1:

Что-то в этом роде, возможно (не проверено):

 template lt;std::size_t N, typename Tuple, size_t... Isgt; constexpr bool myFunction1(const char (amp;fmt)[N], std::index_sequencelt;Is...gt;) {  return myFunctionlt;N, std::tuple_element_tlt;Is, Tuplegt;...gt;(fmt); }  template lt;std::size_t N, typename Tuplegt; constexpr bool myFunction2(const char (amp;fmt)[N]) {  return myFunction1lt;N, Tuplegt;(fmt, std::make_index_sequencelt;std::tuple_size_vlt;Tuplegt;gt;{}); }  

Макрос подошел бы

 myFunction2lt;sizeof(fmt), decltype(std::make_tuple(__VA_ARGS__))gt;(fmt)  

Комментарии:

1. Это работает. Я думал об этом, но был действительно сбит с толку … синтаксис с помощью std::tuple_element_t. Большое спасибо!