在 MFC 应用程序中,我喜欢将 SQL 日期值 ( CDBVariant) 映射到 MFC CTime。因为数据库条目可以为NULL(值不存在),不知是否CTime可以为空。MFC文档中的评论CTime::Format让我思考,应该是可能的:
如果此 CTime 对象的状态为 null,则返回值为空字符串。
- 但是如何设置这个状态,甚至可能吗?
- 如果不可能,我想
boost::optional<CTime>这是一个不错的选择吗?
CTime 只是一个__time64_t. 当您调用格式时,它会执行以下操作:
inline CString CTime::Format(_In_z_ LPCTSTR pFormat) const
{
if(pFormat == NULL)
{
return pFormat;
}
TCHAR szBuffer[maxTimeBufferSize];
struct tm ptmTemp;
if (_localtime64_s(&ptmTemp, &m_time) != 0)
{
AtlThrow(E_INVALIDARG);
}
if (!_tcsftime(szBuffer, maxTimeBufferSize, pFormat, &ptmTemp))
{
szBuffer[0] = '\0';
}
return szBuffer;
}
所以你要查看的系统函数是_tcsftime。这就是我认为文档不是很准确的地方。如果_localtime64_s失败,您将收到异常,因此“空”时间不能真正传递给_tcsftime. 如果失败,您只会得到 NULL ,_tcsftime但这不会是因为“null”时间。
所以,简而言之,使用你建议的东西boost::optional来表示空值。