2017-08-07 83 views
1

使用下面顯示的結構,我可以像這樣使用它。C++傳遞一個匿名結構的引用 - 你能嗎?

NMEADecodedSentence s; 
auto & gga = s.GGA; 
auto alt = gga.Alt; 

但有可能對匿名結構的引用傳遞給一個函數,如:

SomeFunc(gga); 

如果是的話,會是什麼函數簽名是什麼樣子?我的想法是沒有命名的結構,但我只是想知道是否有一些聰明的做法,我不知道!

struct NMEADecodedSentence 
    { 
     GNSSSentenceType Type; 
     GNSSTalkerId TalkerId; 
     union 
     { 
      struct 
      { 
       char Time[10];   // UTC time - hhmmss.ss 
       char Lat[13];   // Latitude (degrees & minutes) - ddmm.mmmmm 
       char NS;    // North/South indicator 
       char Long[14];   // Longitude (degrees & minutes) - dddmm.mmmmm 
       char EW;    // East/West indicator 
       uint8_t Quality;  // Quality indicator for position fix 
       uint8_t NumSV;   // Number of satellites used (0-12) 
       float HDOP;    // Horizontal Dilution of Precision 
       float Alt;    // Altitude above mean sea level - meters 
      }GGA; 
      struct // Recommended minimum data 
      { 
       char Time[10];   // UTC time - hhmmss.ss 
       char Status;   // Status, V = Navigation receiver warning, A = Data valid 
       char Lat[13];   // Latitude (degrees & minutes) - ddmm.mmmmm 
       char NS;    // North/South indicator 
       char Long[14];   // Longitude (degrees & minutes) - dddmm.mmmmm 
       char EW;    // East/West indicator 
       float Spd;    // Speed over ground - knots 
       float COG;    // Course over ground - degrees 
       char Date[7];   // UTC Date - ddmmyy 
      }RMC; 
      struct // Course over ground and ground speed 
      { 
       float COGT;    // Course over ground (true) - degrees 
       float COGM;    // Course over ground (magnetic) - degrees 
       float Kph;    // Speed over ground - kph 
      }VTG; 
     }; 
    }; 
+1

你想在函數聲明中使用'auto'嗎? –

+0

解釋:你可以做這個,但**應該**你?在聲明中省略名稱真的值得接收函數中額外的樣板嗎?你從中得到了什麼,真的嗎? –

+0

@underscore_d聲明可能是某種類型的庫或供應商提供的代碼,因此他可能不會冒險去改變它(編輯具有外部源的頭文件通常是個壞主意) – Swift

回答

4

這應該工作:

void f(decltype(NMEADecodedSentence::GGA)& gga) 
{ 
    ... 
} 
+0

是的,這確實正好回答了我的問題。好想法!謝謝... –

5

你可以做到這一點,如果編譯器支持decltype功能(標準的一部分,但我們都知道是怎麼一回事呢..)

char foo2(decltype (NMEADecodedSentence::GGA) & param) 
{ 
    return param.EW; 
} 

decltype對模板構建非常有用。作爲類的非靜態成員的名稱,在這種情況下可以使用NMEADecodedSentence::GGA

打開模板是可用的,但是類型不安全,因爲您可能會嘗試提供任何包含功能中使用的相同字段而不是NMEADecodedSentence::GGA。這可能是架構的功能或錯誤。

可以保護模板是這樣的:

#include <type_traits> 

template<typename T> 
char foo(T &a) 
{ 
    static_assert(std::is_same<T,decltype (NMEADecodedSentence::GGA)>::value || 
       std::is_same<T,decltype (NMEADecodedSentence::RMC)>::value, 
       "Wrong type of foo() argument"); 
    return a.EW; 
} 

static_assert會產生一個編譯時錯誤(這就是爲什麼它是「靜態」),如果你提供foo與不同類型的參數:std::is_same<>::value會是假的。

注意,你可以這樣做,以及:

struct GGAType : public decltype (NMEADecodedSentence::GGA) 
{ 
}; 

但上述模板不會接受這種類型的參數沒有修復到static_assert表達。 foo2()會起作用。