fork download
  1. #include <utility>
  2.  
  3. enum CLStatus {CLSTATUS_SUCCESS, CLSTATUS_INVALIDPROJECTIONTYPE};
  4. enum CEPTType {CEPTFull, CEPTBrief};
  5.  
  6. struct From {
  7. CEPTType eType;
  8. };
  9. struct Has {
  10. struct data {
  11. From xFull;
  12. int xBrief;
  13. } xData;
  14. CEPTType eType;
  15. };
  16. struct HasNot {
  17. struct data {
  18. From xFull;
  19. } xData;
  20. CEPTType eType;
  21. };
  22. CLStatus Convert(From f, int& dest) {
  23. return CLSTATUS_SUCCESS;
  24. }
  25.  
  26.  
  27.  
  28. //ANSWER GOES HERE:
  29.  
  30. template< class... >
  31. using void_t = void;
  32.  
  33. template <class Obj, class ObjResult, class = void>
  34. struct ConvertIfHasBrief {
  35. static auto Convert(Obj const &, ObjResult &) -> CLStatus {
  36. return {};// dymmy value, not used
  37. }
  38. };
  39.  
  40. template <class Obj, class ObjResult>
  41. struct ConvertIfHasBrief <Obj, ObjResult,
  42. void_t<decltype(std::declval<ObjResult>().xData.xBrief)>> {
  43. static auto Convert(Obj const &xFrom, ObjResult &xTo) {
  44. return ::Convert(xFrom, xTo.xData.xBrief);
  45. }
  46. };
  47.  
  48.  
  49.  
  50. template< class Obj, class ObjResult>
  51. CLStatus convertObjToResult( const Obj & xFrom, ObjResult & xTo )
  52. {
  53. CLStatus eStatus = CLSTATUS_SUCCESS;
  54. switch ( xTo.eType )
  55. {
  56. case CEPTFull:
  57. xTo.xData.xFull = xFrom;
  58. break;
  59. case CEPTBrief:
  60. eStatus = ConvertIfHasBrief<Obj, ObjResult>::Convert(xFrom, xTo);
  61. break;
  62. default:
  63. eStatus = CLSTATUS_INVALIDPROJECTIONTYPE;
  64. }
  65. return eStatus;
  66. }
  67.  
  68.  
  69.  
  70. // RUN THE TEST
  71.  
  72. #include <iostream>
  73. int main() {
  74. Has has;
  75. HasNot has_not;
  76. std::cout << convertObjToResult(From{}, has);
  77. std::cout << convertObjToResult(From{}, has_not);
  78.  
  79. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
00