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

时间:2017-08-07 08:32:51

标签: c++ structure anonymous

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

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

2 个答案:

答案 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)
{
    ...
}