Сообщение Обернуть С API от 04.04.2017 9:42
Изменено 04.04.2017 9:54 Kernan
Обернуть С API
Привет,
Есть C API работу с которым хочется обернуть т.к. для использования API надо выполнить некоторые рутинные вещи. Проблема в том, параметр в виде структуры передающиеся в функцию-обёртку могут иметь, а могут не иметь некоторых полей для заполнения, следовательно, нужно выбирать алгоритмы с разными рутинами. Я осилил создание шаблона HasField для проверки наличия поля в структуре, но не понимаю как это использовать.
Как я себе это представляю
Хочется увидеть код здорового человека. Нужен С++11, желательно чтобы был совместим с C++0x, т.е. поддержка не очень свежим gcc.
Есть C API работу с которым хочется обернуть т.к. для использования API надо выполнить некоторые рутинные вещи. Проблема в том, параметр в виде структуры передающиеся в функцию-обёртку могут иметь, а могут не иметь некоторых полей для заполнения, следовательно, нужно выбирать алгоритмы с разными рутинами. Я осилил создание шаблона HasField для проверки наличия поля в структуре, но не понимаю как это использовать.
Как я себе это представляю
Скрытый текст | |
далее идёт код курильшика | |
template<typename T, typename = void>
struct HasField_abc : std::false_type { };
template<typename T>
struct HasField_abc<T, decltype(std::declval<T>().abc, void())> : std::true_type { };
template<typename T, typename U = HasField_abc<T>::value>
void get(T& value);
// да, я понимю что частичная специализация не применима
template<typename T, std::true_type>
void get(T& value);
{
// поле есть
value.abc = c_api_do_stuff();
c_api_get(value);
}
template<typename T, std::false_type>
void get(T& value);
{
// поля нет
c_api_get(value);
}
Хочется увидеть код здорового человека. Нужен С++11, желательно чтобы был совместим с C++0x, т.е. поддержка не очень свежим gcc.
Обернуть С API
Привет,
Есть C API работу с которым хочется обернуть т.к. для использования API надо выполнить некоторые рутинные вещи. Проблема в том, параметр в виде структуры передающиеся в функцию-обёртку могут иметь, а могут не иметь некоторых полей для заполнения, следовательно, нужно выбирать алгоритмы с разными рутинами. Я осилил создание шаблона HasField для проверки наличия поля в структуре честно сперев его на SO и не разобравщись как оно работает , но не понимаю как это использовать для выбора алгоритма.
Как я себе это представляю
Хочется увидеть код здорового человека. Нужен С++11, желательно чтобы был совместим с C++0x, т.е. поддержка не очень свежим gcc.
Есть C API работу с которым хочется обернуть т.к. для использования API надо выполнить некоторые рутинные вещи. Проблема в том, параметр в виде структуры передающиеся в функцию-обёртку могут иметь, а могут не иметь некоторых полей для заполнения, следовательно, нужно выбирать алгоритмы с разными рутинами. Я осилил создание шаблона HasField для проверки наличия поля в структуре честно сперев его на SO и не разобравщись как оно работает , но не понимаю как это использовать для выбора алгоритма.
Как я себе это представляю
Скрытый текст | |
далее идёт код курильшика | |
template<typename T, typename = void>
struct HasField_abc : std::false_type { };
template<typename T>
struct HasField_abc<T, decltype(std::declval<T>().abc, void())> : std::true_type { };
template<typename T, typename U = HasField_abc<T>::value>
void get(T& value);
// да, я понимю что частичная специализация не применима
template<typename T, std::true_type>
void get(T& value);
{
// поле есть
value.abc = c_api_do_stuff();
c_api_get(value);
}
template<typename T, std::false_type>
void get(T& value);
{
// поля нет
c_api_get(value);
}
Хочется увидеть код здорового человека. Нужен С++11, желательно чтобы был совместим с C++0x, т.е. поддержка не очень свежим gcc.