【问题标题】:c++ template result typec++模板结果类型
【发布时间】:2019-12-03 10:29:12
【问题描述】:

在我的 Qt 项目中,我经常需要访问当前日期/时间。由于不同的数据类型(尤其是字符串类型)需要此值,因此我编写了以下模板:

   /* used constants */
   const bool UTC_TIME = true;
   const bool LOCAL_TIME = !UTC_TIME;
   const char* vsoft::iot_opcua::Constants::DateTimeFormat = "yyyy-MM-dd hh:mm:ss.zzz";

   template< class T = QDateTime >
   auto curDateTime( const bool acbAsUTC = LOCAL_TIME ) -> std::conditional_t< ( std::is_same< T, QString     >::value ) ||
                                                                               ( std::is_same< T, std::string >::value ) ||
                                                                               ( std::is_same< T, char*       >::value ) ||
                                                                               ( std::is_same< T, const char* >::value )
                                                                               , T          /* explicit string cast */
                                                                               , QDateTime  /* default return type  */
                                                                             >
   {
      QDateTime lDateTime( QDateTime::currentDateTime() );

      if ( acbAsUTC )
      {
         lDateTime = lDateTime.toUTC();
      }


      if constexpr ( std::is_same< T, QString >::value )
      {
         return lDateTime.toString( vsoft::iot_opcua::Constants::DateTimeFormat );
      }

      if constexpr ( std::is_same< T, std::string >::value )
      {
         return lDateTime.toString( vsoft::iot_opcua::Constants::DateTimeFormat ).toStdString();
      }

      if constexpr ( ( std::is_same< T, char* >::value ) || ( std::is_same< T, const char* >::value ) )    
      {
         return lDateTime.toString( vsoft::iot_opcua::Constants::DateTimeFormat ).toStdString().c_str();
      }

      return lDateTime;
   }

但编译器在最后一行显示编译器错误 C2440:“return: cannot convert from 'QDateTime' to 'QString'”

return lDateTime;

为什么编译器要强制转换?所有显式允许的返回类型之前都已处理,因此唯一剩下的返回类型应该是 QDateTime。

【问题讨论】:

标签: c++ templates


【解决方案1】:

您在同一个函数中返回不同的类型。确保在编译时计算所有表达式。

if constexpr (...)
    return ...;
else if constexpr ( ... )
    return ...;
else
    return default_value;

您的行return lDateTime; 应该在constepxr if/else 中。

【讨论】:

  • 我只允许某些字符串返回类型,在所有其他情况下应该返回 QDateTime。这是为了防止像curDateTime&lt; int &gt;() 这样的电话。我允许的所有不同于 QDateType 的返回类型都在模板中处理。
  • 但我添加了 else 并且它有效。小改变,大作用。只见树木不见森林。
  • @SoerenZimmermann 是的,因为使用 else,您不会在 1 个函数中返回 2 种类型,而是每个函数返回 1 种类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多