Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何制作declval的向后兼容版本?_C++_Decltype - Fatal编程技术网

C++ 如何制作declval的向后兼容版本?

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 我尝试过寻找其他的写作方法,但没有

我有以下代码行可在C++11 Red Hat Linux上运行:

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:没有这样的文件或目录