【问题标题】:Is there a way to create a c++ template with different return types?有没有办法创建具有不同返回类型的 c++ 模板?
【发布时间】:2019-11-10 12:30:23
【问题描述】:

我想知道是否有办法编写具有不同返回类型的 C++ 模板。

我的用例是一个从列表中返回最大值的方法。

但是由于我使用的是 Qt 框架,所以这个函数应该能够处理数字和 QString 值。当给这个函数提供一个 QString 列表时,函数应该返回最大字符串的长度。在传递数值的情况下,输入类型应为返回类型。

我写的是这样的:

template< class T >
auto getMax( QList< T > aList ) -> decltype( std::is_arithmetic< T >::value ? T : int( 0 ) )
{
  if ( std::is_arithmetic< T >::value )
  {
      T Result( aList.isEmpty() ? 0 : aList.first() );
      for ( auto lElement : aList )
      {
          Result = std::max( Result, lElement );
      }

      return Result;
  }

  if ( std::is_same< T, QString >::value )
  {
      // List contains QString -> return length of largest string
      int Result( aList.isEmpty() ? 0 : aList.first().length() );

      for ( const QString & lrcsElement : aList )
      {
          Result = std::max( lrcsElement.length(), Result );
      }

      return Result;
  }

  return 0;
}

此代码使用 VS 2017 编译。

但是当我想像这样使用模板功能时

const QString sError  ( tr( "Error"       ) );
const QString sWarning( tr( "Warning"     ) );
const QString sInfo   ( tr( "Information" ) );
const QString sDebug  ( tr( "Debug "      ) );
auto iMaxTextLength( SMUtils::getMax< QString >( { sError, sWarning, sInfo, sDebug } ) );

编译器给了我一些错误信息:

  • 错误 C2672:“SMUtils::getMax”:找不到匹配的重载函数。
  • 错误 C2893:无法专门化函数模板“未知类型 SMUtils::getMax(QList)”。
  • 错误 C2119:“li32MaxTextLength”:“auto”的类型无法从空的初始值设定项中推断出来。

当然我可以编写一个专门的getMax( QStringList ) 方法,但我想知道是否可以只使用一个模板函数。

这有可能吗?如果可以,怎么做?

谢谢, 索伦

【问题讨论】:

  • 如果你使用 c++17 stackoverflow.com/questions/41273101/…,我会选择 constexpr
  • 离题:认为本地化编译器消息是个好主意的人应该被认为是疯了。现在这个可怜的家伙应该如何在 SO 上发布编译器消息?

标签: c++ templates


【解决方案1】:

-&gt; decltype( std::is_arithmetic&lt; T &gt;::value ? T : int( 0 ) )

应该是

-&gt; std::conditional_t&lt;std::is_arithmetic&lt;T&gt;::value, T, int&gt;;

甚至完全省略它,让编译器推导出它(但需要正确的返回类型,所以遵循if constexpr)。

和你的

if ( std::is_arithmetic< T >::value )

应该是

if constexpr ( std::is_arithmetic< T >::value )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2023-03-26
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多