【发布时间】: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 上发布编译器消息?