gpt4 book ai didi

c++ - 在没有 this-> 或 RealType::的情况下解析依赖模板类型:

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:47 25 4
gpt4 key购买 nike

我将从一些代码开始。考虑:

template <typename Message> void ProcessMessage (const Message& msg)
{
const uint32_t value = msg.mValue.GetValAs <uint32_t>();
}

这里,对于不同的Message类型,mValue的类型是不同的。它可能是的所有类型都有一个成员模板函数 GetValAs 和一个成员 mValue —— 这些都是不变的条件。 Message 可能是这样的:

class Message16
{
public:
Message16 (uint16_t value) : mValue (value) {};
UInt16Field mValue;
};

其中 UInt16Field 是类模板的具体实例。

也可能是:

class Message32
{
public:
Message32 (uint32_t value) : mValue (value) {};
std::string mFoo;
double mBar;
UInt32Field mValue;
};

其中 UIInt32Field 是同一类模板的另一个具体实例。

现在这里的问题是依赖名称的解析,特别是:

template <typename Message> void ProcessMessage (const Message& msg)
{
const uint32_t value = msg.mValue.GetValAs <uint32_t>();
}

产生编译器错误:

main.cpp: In function ‘void ProcessMessage(const Message&)’:
main.cpp:60:57: error: expected primary-expression before ‘>’ token
main.cpp:60:59: error: expected primary-expression before ‘)’ token

好的,这通常很简单...我只需使用 this->RealType:: 来解析从属名称。比如:

    const uint32_t value = msg.mValue.UInt16Field::GetValAs <uint32_t>();
^^^^^^^^^^^^^

只要 mValue 始终是 UInt16Field 就可以正常工作——但事实并非如此。它可以是(几乎)任何东西。例如,如果我尝试使用 Message32 调用 ProcessMessage:

const uint32_t u32 = 32;
Message32 msg32 (u32);
ProcessMessage (msg32);

我得到了一些预期的(当然不是很好的)编译器错误:

error: ‘GetValAs<uint32_t>’ is not a member of ‘const UInt32Field {aka const IntegralField<unsigned int>}’

那么,问题是……

如何在这里引入mValue的依赖类型:

    const uint32_t value = msg.mValue.GetValAs <uint32_t>();

不使用this->(因为没有this)或RealType::(因为我不知道 >RealType)?


这是一个完整的测试平台,尽可能简短:

template <typename IntegralType>
class BasicField
{
public:
BasicField (IntegralType val) : mValue (val) {}
IntegralType mValue;
};

template <typename IntegralType>
class IntegralField
:
public BasicField <IntegralType>
{
public:
IntegralField (IntegralType val)
:
BasicField <IntegralType> (val*2)
{
}

IntegralType GetVal () const
{
return this->mValue/2;
}

operator IntegralType () const
{
return GetVal();
}

template <typename As> As GetValAs () const
{
return static_cast <As> (GetVal());
}
};

typedef IntegralField <uint16_t> UInt16Field;
typedef IntegralField <uint32_t> UInt32Field;

class Message16
{
public:
Message16 (uint16_t value) : mValue (value) {};
UInt16Field mValue;
};

class Message32
{
public:
Message32 (uint32_t value) : mValue (value) {};
std::string mFoo;
double mBar;
UInt32Field mValue;
};

template <typename Message> void ProcessMessage (const Message& msg)
{
const uint32_t value = msg.mValue.GetValAs <uint32_t>();
}

int main()
{
const uint16_t u16 = 16;
Message16 msg16 (u16);
ProcessMessage (msg16);

const uint32_t u32 = 32;
Message32 msg32 (u32);
ProcessMessage (msg32);

}

最佳答案

你可能需要向编译器解释 GetValAs 是一个模板,尝试:

msg.mValue.template GetValAs<uint32_t>();

关于c++ - 在没有 this-> 或 RealType::的情况下解析依赖模板类型:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690351/

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