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() 可以。