C++ 如何制作declval的向后兼容版本?
我有以下代码行可在C++11 Red Hat Linux上运行:C++ 如何制作declval的向后兼容版本?,c++,decltype,C++,Decltype,我有以下代码行可在C++11 Red Hat Linux上运行: struct ConvertIfHasBrief< Obj, ObjResult, void_t< decltype( declval<ObjResult>().xData.xBrief ) > > struct convertifhashbrief 但是我需要它也在旧版本的Solaris上使用C++的旧版本。我很难弄清楚cc的版本,但它是Sunos5.9 我尝试过寻找其他的写作方法,但没有
struct ConvertIfHasBrief< Obj, ObjResult, void_t< decltype( declval<ObjResult>().xData.xBrief ) > >
struct convertifhashbrief>
<>但是我需要它也在旧版本的Solaris上使用C++的旧版本。我很难弄清楚cc的版本,但它是Sunos5.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;
}
模板
结构使无效
{
typedef-void型;
};
模板
结构无效\u t
{
使用make_void::type;
};
模板
结构ConvertIfHasBrief
{
静态自动转换(Obj const&,ObjResult&)->CLStatus
{
返回{};//伪值,未使用
}
};
模板
结构转换hasBrief>
{
静态自动转换(Obj const&xFrom、ObjResult&xTo)->CLStatus
{
return::Convert(xFrom,xTo.xData.xBrief);
}
};
模板
CLStatus convertObjToResult(常量Obj&xFrom、ObjResult&xTo)
{
CLStatus eStatus=CLStatus\U SUCCESS;
开关(xTo.eType)
{
案例内容:
xTo.xData.xFull=xFrom;
打破
案例CEPTBrief:
eStatus=ConvertIfHasBrief:Convert(xFrom,xTo);
打破
违约:
eStatus=CLSTATUS\u INVALIDPROJECTIONTYPE;
}
归还遗产;
}
<>和进一步参考,这是这个代码产生的问题:你可以使用什么版本的C++?如果你没有<代码> STD::Debug Value/C>,你可能也没有RoValk引用。所以你只需要一个函数模板声明,不是吗?您可能会发现非常相关的信息。只需检查在GCC中添加每个功能的时间,以确定这是否可行。@NathanOliver:否。
致命错误:boost/utility/declval.hpp:没有这样的文件或目录