使用下面显示的结构,我可以像这样使用它。
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;
};
};
答案 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
会产生编译时错误(这就是为什么它是&#34;静态&#34;),如果你为foo
提供不同类型的参数:{{1将是假的。
请注意,您也可以这样做:
std::is_same<>::value
但如果没有修复static_assert表达式,上述模板将不接受此类型的参数。 struct GGAType : public decltype (NMEADecodedSentence::GGA)
{
};
可行。
答案 1 :(得分:4)
这应该有效:
void f(decltype(NMEADecodedSentence::GGA)& gga)
{
...
}