C++ 传递对匿名结构的引用 - 你可以吗?
C++ Passing a reference to an anonymous structure - can you?
使用如下所示的结构,我可以像这样使用它。
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;
};
};
这应该有效:
void f(decltype(NMEADecodedSentence::GGA)& gga)
{
...
}
如果编译器支持 decltype 功能(标准的一部分,但我们都知道它是怎么回事……),您可以这样做。
char foo2(decltype (NMEADecodedSentence::GGA) & param)
{
return param.EW;
}
decltype
对于模板构建非常有用。 NMEADecodedSentence::GGA
作为 class 的非静态成员的名称在这种情况下可用。
Open 模板可用,但类型不安全,因为您可能会尝试提供包含函数中使用的相同字段的任何内容,而不是 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
会产生编译时错误(这就是为什么它是 "static"),如果你为 foo
提供不同类型的参数:std::is_same<>::value
将是错误的.
请注意,您也可以这样做:
struct GGAType : public decltype (NMEADecodedSentence::GGA)
{
};
但是如果不修复 static_assert 表达式,上述模板将不会接受这种类型的参数。 foo2()
可以。
使用如下所示的结构,我可以像这样使用它。
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;
};
};
这应该有效:
void f(decltype(NMEADecodedSentence::GGA)& gga)
{
...
}
如果编译器支持 decltype 功能(标准的一部分,但我们都知道它是怎么回事……),您可以这样做。
char foo2(decltype (NMEADecodedSentence::GGA) & param)
{
return param.EW;
}
decltype
对于模板构建非常有用。 NMEADecodedSentence::GGA
作为 class 的非静态成员的名称在这种情况下可用。
Open 模板可用,但类型不安全,因为您可能会尝试提供包含函数中使用的相同字段的任何内容,而不是 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
会产生编译时错误(这就是为什么它是 "static"),如果你为 foo
提供不同类型的参数:std::is_same<>::value
将是错误的.
请注意,您也可以这样做:
struct GGAType : public decltype (NMEADecodedSentence::GGA)
{
};
但是如果不修复 static_assert 表达式,上述模板将不会接受这种类型的参数。 foo2()
可以。