#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. Большое спасибо!