HOME

This sample converts in compile time a string into a constant.

I have the strings "right", "center", "end" and "start". Each string correspond to a const value in enum.

C++ 11

enum TextAlign 
{ 
    TextAlignStart, 
    TextAlignEnd, 
    TextAlignLeft, 
    TextAlignRight, 
    TextAlignCenter
}; 

constexpr TextAlign CaseCenter(const char* p) 
{ 
    return (p[0] == L'e' && p[1] == L'n' &&  p[2] == L't' && p[3] == L'e' && p[4] == L'r') ? TextAlignCenter : throw "error"; 
} 

constexpr TextAlign CaseEnd(const char* p) 
{ 
    return (p[0] == L'n' && p[1] == L'd') ? TextAlignEnd : throw "error"; 
} 

constexpr TextAlign CaseLeft(const char* p) 
{ 
    return (p[0] == L'e' && p[1] == L'f' &&  p[2] == L't') ? TextAlignLeft : throw "error"; 
} 


constexpr TextAlign CaseRight(const char* p) 
{ 
    return (p[0] == L'i' && p[1] == L'g' &&  p[2] == L'h' && p[3] == L't') ? TextAlignRight : throw "error"; 
} 

constexpr TextAlign CaseStart(const char* p) 
{ 
    return (p[0] == L't' && p[1] == L'a' &&  p[2] == L'r' && p[3] == L't') 
                    ? TextAlignStart : throw "error"; 
} 

constexpr TextAlign TextAlign(const char* p) 
{ 
    return (*p == L'c') ? CaseCenter(p + 1) : (*p == L'e') ? CaseEnd(p + 1) : (*p == L'l') 
                        ? CaseLeft(p + 1) : (*p == L'r') ? CaseRight(p + 1) : (*p == L's') 
                        ? CaseStart(p + 1) : throw "error"; 
}

int main() 
{ 
    static_assert(TextAlign("right") == TextAlignRight, "right ops"); 
    static_assert(TextAlign("center") == TextAlignCenter, "center ops"); 
    static_assert(TextAlign("end") == TextAlignEnd, "end ops"); 
    static_assert(TextAlign("start") == TextAlignStart, "start ops"); 
    const char* p = "center"; 
    std::cout << "Test = " << Test(p); 
} 

C++ 03


#include <cstring>
#include <iostream>

enum TextAlign
{
    TextAlignStart,
    TextAlignEnd,
    TextAlignLeft,
    TextAlignRight,
    TextAlignCenter
};


#define CaseCenter(p0, p1, p2, p3, p4) ((p0 == L'e' && p1 == L'n' &&  p2 == L't' && p3 == L'e' && p4 == L'r') ? TextAlignCenter : -1)
#define CaseEnd(p0, p1, p2, p3, p4) ((p0 == L'n' && p1 == L'd') ? TextAlignEnd : -1)
#define CaseLeft(p0, p1, p2, p3, p4) ((p0 == L'e' && p1 == L'f' &&  p2 == L't') ? TextAlignLeft : -1)
#define CaseRight(p0, p1, p2, p3, p4) ((p0 == L'i' && p1 == L'g' &&  p2 == L'h' && p3 == L't') ? TextAlignRight : -1)
#define CaseStart(p0, p1, p2, p3, p4) ((p0 == L't' && p1 == L'a' &&  p2 == L'r' && p3 == L't') ? TextAlignStart : -1)
#define TextAlign(p0, p1, p2, p3, p4, p5)  ((p0 == L'c') ? CaseCenter(p1, p2, p3, p4, p5) : (p0 == L'e') ? CaseEnd(p1, p2, p3, p4, p5) : (p0 == L'l') ? CaseLeft(p1, p2, p3, p4, p5) : (p0 == L'r') ? CaseRight(p1, p2, p3, p4, p5) : (p0 == L's') ? CaseStart(p1, p2, p3, p4, p5) : -1)


int Test(const char* p) 
{ 
    switch (TextAlign(p[0], p[1], p[2], p[3], p[4], p[5])) 
    { 
    case TextAlign('r', 'i', 'g', 'h', 't', '\0'):  return 1; 
    case TextAlign('c', 'e', 'n', 't', 'e', 'r'): return 2; 
    case TextAlign('e', 'n', 'd', '\0', '\0', '\0'):    return 3; 
    case TextAlign('s', 't', 'a', 'r', 't', '\0'):  return 4; 
    } 
    return 0; 
} 

int main()
{
    static_assert(TextAlign('s', 't', 'a', 'r', 't', '\0') == TextAlignStart, "");
    static_assert(TextAlign('c', 'e', 'n', 't', 'e', 'r') == TextAlignCenter, "");
    static_assert(TextAlign('l', 'e', 'f', 't', '\0', '\0') == TextAlignLeft, "");
    static_assert(TextAlign('e', 'n', 'd', '\0', '\0', '\0') == TextAlignEnd, "");
    static_assert(TextAlign('r', 'i', 'g', 'h', 't', '\0') == TextAlignRight, "");

    std::cout << Test("center");
}