#include <utility>
enum CLStatus {CLSTATUS_SUCCESS, CLSTATUS_INVALIDPROJECTIONTYPE};
enum CEPTType {CEPTFull, CEPTBrief};
struct From {
CEPTType eType;
};
struct Has {
struct data {
From xFull;
int xBrief;
} xData;
CEPTType eType;
};
struct HasNot {
struct data {
From xFull;
} xData;
CEPTType eType;
};
CLStatus Convert(From f, int& dest) {
return CLSTATUS_SUCCESS;
}
//ANSWER GOES HERE:
template< class... >
using void_t = void;
template <class Obj, class ObjResult, class = void>
struct ConvertIfHasBrief {
static auto Convert(Obj const &, ObjResult &) -> CLStatus {
return {};// dymmy value, not used
}
};
template <class Obj, class ObjResult>
struct ConvertIfHasBrief <Obj, ObjResult,
void_t<decltype(std::declval<ObjResult>().xData.xBrief)>> {
static auto Convert(Obj const &xFrom, ObjResult &xTo) {
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;
}
// RUN THE TEST
#include <iostream>
int main() {
Has has;
HasNot has_not;
std::cout << convertObjToResult(From{}, has);
std::cout << convertObjToResult(From{}, has_not);
}
I2luY2x1ZGUgPHV0aWxpdHk+CgplbnVtIENMU3RhdHVzIHtDTFNUQVRVU19TVUNDRVNTLCBDTFNUQVRVU19JTlZBTElEUFJPSkVDVElPTlRZUEV9OwplbnVtIENFUFRUeXBlIHtDRVBURnVsbCwgQ0VQVEJyaWVmfTsKCnN0cnVjdCBGcm9tIHsKICAgIENFUFRUeXBlIGVUeXBlOwp9OwpzdHJ1Y3QgSGFzIHsKCXN0cnVjdCBkYXRhIHsgCiAgICAgICBGcm9tIHhGdWxsOwogICAgICAgaW50IHhCcmllZjsKCX0geERhdGE7CglDRVBUVHlwZSBlVHlwZTsKfTsKc3RydWN0IEhhc05vdCB7CglzdHJ1Y3QgZGF0YSB7IAogICAgICAgRnJvbSB4RnVsbDsKCX0geERhdGE7CglDRVBUVHlwZSBlVHlwZTsKfTsKQ0xTdGF0dXMgQ29udmVydChGcm9tIGYsIGludCYgZGVzdCkgewogICAgcmV0dXJuIENMU1RBVFVTX1NVQ0NFU1M7Cn0KCgoKLy9BTlNXRVIgR09FUyBIRVJFOgoKdGVtcGxhdGU8IGNsYXNzLi4uID4KdXNpbmcgdm9pZF90ID0gdm9pZDsKCnRlbXBsYXRlIDxjbGFzcyBPYmosIGNsYXNzIE9ialJlc3VsdCwgY2xhc3MgPSB2b2lkPgpzdHJ1Y3QgQ29udmVydElmSGFzQnJpZWYgewogIHN0YXRpYyBhdXRvIENvbnZlcnQoT2JqIGNvbnN0ICYsIE9ialJlc3VsdCAmKSAtPiBDTFN0YXR1cyAgewogICAgICByZXR1cm4ge307Ly8gZHltbXkgdmFsdWUsIG5vdCB1c2VkCiAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBPYmosIGNsYXNzIE9ialJlc3VsdD4Kc3RydWN0IENvbnZlcnRJZkhhc0JyaWVmIDxPYmosIE9ialJlc3VsdCwKICAgICAgICAgICAgICAgICAgIHZvaWRfdDxkZWNsdHlwZShzdGQ6OmRlY2x2YWw8T2JqUmVzdWx0PigpLnhEYXRhLnhCcmllZik+PiB7CiAgc3RhdGljIGF1dG8gQ29udmVydChPYmogY29uc3QgJnhGcm9tLCBPYmpSZXN1bHQgJnhUbykgewogICAgcmV0dXJuIDo6Q29udmVydCh4RnJvbSwgeFRvLnhEYXRhLnhCcmllZik7CiAgfQp9OwoKCgp0ZW1wbGF0ZTwgY2xhc3MgT2JqLCBjbGFzcyBPYmpSZXN1bHQ+CkNMU3RhdHVzIGNvbnZlcnRPYmpUb1Jlc3VsdCggY29uc3QgT2JqICYgeEZyb20sIE9ialJlc3VsdCAmIHhUbyApCnsKICAgIENMU3RhdHVzIGVTdGF0dXMgPSBDTFNUQVRVU19TVUNDRVNTOwogICAgc3dpdGNoICggeFRvLmVUeXBlICkKICAgIHsKICAgICAgICBjYXNlIENFUFRGdWxsOgogICAgICAgICAgICB4VG8ueERhdGEueEZ1bGwgPSB4RnJvbTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDRVBUQnJpZWY6CiAgICAgICAgICAgICAgICBlU3RhdHVzID0gQ29udmVydElmSGFzQnJpZWY8T2JqLCBPYmpSZXN1bHQ+OjpDb252ZXJ0KHhGcm9tLCB4VG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBlU3RhdHVzID0gQ0xTVEFUVVNfSU5WQUxJRFBST0pFQ1RJT05UWVBFOwogICAgfQogICAgcmV0dXJuIGVTdGF0dXM7Cn0KCgoKLy8gUlVOIFRIRSBURVNUCgojaW5jbHVkZSA8aW9zdHJlYW0+CmludCBtYWluKCkgewoJSGFzIGhhczsKCUhhc05vdCBoYXNfbm90OwogICAgc3RkOjpjb3V0IDw8IGNvbnZlcnRPYmpUb1Jlc3VsdChGcm9te30sIGhhcyk7CiAgICBzdGQ6OmNvdXQgPDwgY29udmVydE9ialRvUmVzdWx0KEZyb217fSwgaGFzX25vdCk7CiAgICAKfQ==