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

时间:2016-01-20 20:00:57

标签: c++ decltype

我有以下代码行适用于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?

0 个答案:

没有答案