gpt4 book ai didi

C++ 传递对匿名结构的引用 - 你可以吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:59 25 4
gpt4 key购买 nike

使用下面显示的结构,我可以像这样使用它。

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;
};
};

最佳答案

你可以这样做,如果编译器支持 decltype 特性(标准的一部分,但我们都知道它是怎么回事......)

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

decltype对于模板构建非常有用。 NMEADecodedSentence::GGA作为类的非静态成员的名称在这种情况下是可用的。

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如果您提供 foo,将产生编译时错误(这就是它是“静态”的原因)具有不同类型的参数:std::is_same<>::value将是错误的。

请注意,您也可以这样做:

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

但是如果不修复 static_assert 表达式,上述模板将不会接受这种类型的参数。 foo2()会工作。

关于C++ 传递对匿名结构的引用 - 你可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com