Как я могу сделать функцию ниже constexpr
?
Это функция, которую я использую для создания структуры POD, которая определена в файле заголовка «C», который я не могу изменить.
Я получил следующий помощник функции stati c (который работает) для создания этих структур, я считаю, что это не constexpr
, поскольку вызов strncpy
нарушает constexpr
.
static auto makeWPTEntry(
const char* name,
double aLatDeg, double aLatMin, double aLonDeg,
double aLonMin, char bSeven = false,
double aCourse = 0, double aAzimuth = 0, double aDist = 0,
int aETASecs = 0, int aMod = 0)->WPTEntry {
auto result = WPTEntry{
bSeven,
{},
(aLatDeg + aLatMin) / 60.0,
(aLonDeg + aLonMin) / 60.0,
aCourse, aAzimuth,
aDist, aETASecs, aMod
};
strncpy(result.name, name, sizeof(result.name));
return result;
}
Я изо всех сил пытаюсь сделать что-то в следующих строках (это constexpr
) - однако мне действительно нужна подпись функции не constexpr
с параметром const char* name
. К сожалению, я не знаю, как встроенное преобразование этого const char*
в массив фиксированного размера char const (&name)[SIZ_WAYPOINT_NAME]
для совместимости с конструктором поля структуры.
constexpr auto makeWPTEntry(
char const (&name)[SIZ_WAYPOINT_NAME],
double aLatDeg, double aLatMin, double aLonDeg,
double aLonMin, char bSeven = false,
double aCourse = 0, double aAzimuth = 0,
double aDist = 0,
int aETASecs = 0, int aMod = 0)->WPTEntry {
auto result = WPTEntry{
bSeven,
name,
(aLatDeg + aLatMin) / 60.0,
(aLonDeg + aLonMin) / 60.0,
aCourse, aAzimuth,
aDist, aETASecs, aMod
};
//strncpy(result.name, name, sizeof(result.name));
return result;
}
WPTEntry
- это простая внешняя структура данных C.
#define SIZ_WAYPOINT_NAME 9
typedef struct {
char seven;
char name[SIZ_WAYPOINT_NAME];
double lat;
double lon;
double crs;
double az2;
double distance;
int eta_secs;
int mod;
} WPTEntry;
Я создаю эти структуры следующим образом:
const auto wpt = makeWPTEntry("", -24.499, 0, -81.501, 0);
Я задавал нечто подобное вопрос раньше, но так и не получил ответа.
Я нашел следующее на этом сайте , но я не Я уверен, как я смогу использовать его для адаптации моего параметра, возможно, он может быть полезен или нет.
struct ArrayWrapper
{
char const *address_;
size_t length_;
template<int N>
ArrayWrapper(char const (&array)[N])
{
address = &array[0];
length_ = N;
}
};