我有以下代码行适用于C ++ 11 Red Hat Linux:
struct ConvertIfHasBrief< Obj, ObjResult, void_t< decltype( declval<ObjResult>().xData.xBrief ) > >
但我需要在旧版本的Solaris上使用旧版本的C ++。我无法确定它的cc版本,但它是SunOS 5.9。
我一直试图寻找替代方法来写这个,但是没有找到任何看起来相似的东西。如果它有帮助,下面是整个文件:
template< typename Ts >
struct make_void
{
typedef void type;
};
template< typename Ts >
struct void_t
{
using make_void<Ts>::type;
};
template< class Obj, class ObjResult, class = void >
struct ConvertIfHasBrief
{
static auto Convert( Obj const &, ObjResult & ) -> CLStatus
{
return {}; // dummy value, not used
}
};
template< class Obj, class ObjResult >
struct ConvertIfHasBrief< Obj, ObjResult, void_t< decltype( declval<ObjResult>().xData.xBrief ) > >
{
static auto Convert( Obj const &xFrom, ObjResult &xTo ) -> CLStatus
{
return ::Convert( xFrom, xTo.xData.xBrief );
}
};
template< class Obj, class ObjResult >
CLStatus convertObjToResult( const Obj & xFrom, ObjResult & xTo )
{
CLStatus eStatus = CLSTATUS_SUCCESS;
switch ( xTo.eType )
{
case CEPTFull:
xTo.xData.xFull = xFrom;
break;
case CEPTBrief:
eStatus = ConvertIfHasBrief< Obj, ObjResult >::Convert( xFrom, xTo );
break;
default:
eStatus = CLSTATUS_INVALIDPROJECTIONTYPE;
}
return eStatus;
}
为了进一步参考,这是代码产生的问题:Can I have a single template with a variable object?