簡體   English   中英

帶有 char[] 字段的 POD 結構的 constexpr 構造

[英]constexpr construction of a POD struct with a char[] field

如何使 function 低於constexpr

這是一個 function,我用它來創建一個 POD 結構,該結構在我無法更改的“C”header 文件中定義。

我最終得到了以下 static function 助手(有效)來制作這些結構,我相信它不是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 )做一些事情 - 但是我真的需要帶有const char* name參數的非constexpr function 簽名,不幸的是,我不知道如何內聯將此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;
   }
};

圍繞std::integer_sequence進行了一些操作,我明白了:

#include <utility>
#include <iostream>

extern "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;

};

template<std::size_t N, std::size_t... I>
constexpr WPTEntry makeWPTEntry_in(
        char const (&name)[N],
        double aLatDeg, double aLatMin, double aLonDeg,
        double aLonMin, char bSeven,
        double aCourse, double aAzimuth,
        double aDist,
        int aETASecs, int aMod,
        std::index_sequence<I...>) {
    return WPTEntry{
        bSeven,
        { name[I]... },
        (aLatDeg + aLatMin) / 60.0,
        (aLonDeg + aLonMin) / 60.0,
        aCourse, aAzimuth,
        aDist, aETASecs, aMod
    };
}

template<std::size_t N, typename Indices = std::make_index_sequence<N>>
constexpr WPTEntry makeWPTEntry(
            char const (&name)[N],
            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) {
    return makeWPTEntry_in(name, 
        aLatDeg, aLatMin, aLonDeg,
        aLonMin, bSeven,
        aCourse, aAzimuth,
        aDist,
        aETASecs, aMod,
        Indices{});
}

int main() {
    const auto wpt = makeWPTEntry("", -24.499, 0, -81.501, 0);
}

但實際上,做一個男人並復制它:

template<std::size_t N>
constexpr WPTEntry makeWPTEntry(
            char const (&name)[N],
            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) {
    auto r = WPTEntry{
        bSeven,
        { 0 },
        (aLatDeg + aLatMin) / 60.0,
        (aLonDeg + aLonMin) / 60.0,
        aCourse, aAzimuth,
        aDist, aETASecs, aMod
    };
    for (size_t i = 0; i < N; ++i) {
        r.name[i] = name[i];
    }
    return r;
}

int main() {
    constexpr auto wpt = makeWPTEntry("abc", -24.499, 0, -81.501, 0);
    std::cout << wpt.name;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM