Найдите первый базовый примитив в структуре / классе

Помещение:

У меня есть вариативная функция шаблона, которая принимает POD (простая старая структура данных) с однородными типами членов.

Приемлемый POD может полностью состоять из 4-байтовых целых чисел XOR с 4-байтовыми числами с плавающей запятой.

Внутри переменный параметр приводится к указателю базового типа и используется как примитивный массив.

Проблема:

В настоящее время функция шаблона требует, чтобы пользователь предоставил некоторую дополнительную информацию о форматировании этих POD; например, в следующем:

Декларация

template<typename ...U>
void foo(const char *format, U... bars);

использование

Blah much, wow; // Underlying type is integral.
Bleh such, params; // underlying type is float.
//... 
foo("iffi",much,params,such,wow);

Это работает, но я бы хотел обойти строку форматирования.

Вопрос:

Есть ли способ оценить базовый тип во время компиляции?

Изменить. Макет структуры и имена ее членов неизвестны до времени компиляции. То есть пользователь библиотеки предоставляет произвольный однородный POD.


person Esmeralda Salamone    schedule 09.09.2016    source источник
comment
предоставьте минимальный воспроизводимый пример; как на самом деле выглядят эти структуры? сколько существует различных типов, таких как Blah, Bleh и т. д.?   -  person m.s.    schedule 09.09.2016
comment
В комментариях указано, что структуры представляют собой POD с однородным / однородным базовым типом. Проблема указывает, что тип предоставляется пользователем и поэтому неизвестен библиотеке.   -  person Esmeralda Salamone    schedule 09.09.2016


Ответы (1)


Чтобы обойти форматирование строки, вы можете создать трейт:

template <typename T /*, typename AlwaysVoidForSFINAE = void*/> struct UnderlyingPodType;

template <> struct UnderlyingPodType<Blah> { using type = int; };
template <> struct UnderlyingPodType<Bleh> { using type = float; };

template<typename ...Ts>
void foo(Ts&&... ts)
{
    using types = std::tuple<UnderlyingPodType<std::decay_t<Ts>>...>;
    // ...
}
person Jarod42    schedule 09.09.2016
comment
Расположение структуры и имена ее членов неизвестны. - person Esmeralda Salamone; 09.09.2016
comment
@EsmeraldaSalamone: Я переписываю ответ с этой новой информацией. - person Jarod42; 09.09.2016
comment
Это требует определения специализаций шаблонов для каждого типа, что действительно противоречит цели того, что я собираюсь сделать. Я не хочу, чтобы пользователю функции приходилось предоставлять такие определения для своего типа. - person Esmeralda Salamone; 10.09.2016