我想知道是否有一种方法可以编写具有不同返回类型的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 } ) );
编译器给我一些错误消息:
我当然可以编写专门的getMax( QStringList )
方法,但我想知道是否可以仅使用一个模板函数。
那有可能吗?如果可以,怎么办?
谢谢, 索伦
答案 0 :(得分:8)
-> decltype( std::is_arithmetic< T >::value ? T : int( 0 ) )
应该是
-> std::conditional_t<std::is_arithmetic<T>::value, T, int>;
甚至完全省略它,让编译器推断它(但需要正确的返回类型,因此请遵循if constexpr
)。
和您的
if ( std::is_arithmetic< T >::value )
应该是
if constexpr ( std::is_arithmetic< T >::value )