Listing 4: Generalization via the preprocessor. Not very maintainable...
#if defined(PPHACK_USE_STD_STRING)
typedef std::string string_t;
#elif defined(PPHACK_USE_CSTRING)
typedef CString string_t;
#elif defined(PPHACK_USE_CUSTOM_TYPE)
#if !defined(PPHACK_CUSTOM_TYPE)
#error Must defined PPHACK_CUSTOM_TYPE with custom type
#endif /* !PPHACK_CUSTOM_TYPE */
typedef PPHACK_CUSTOM_TYPE string_t;
#else
#error Must specify recognised PPHACK_USE_*** selector
#endif /* type */
...
for(; begin != end; ++begin)
{
// Add the item to the result ...
string_t const &s(*begin);
#if defined(PPHACK_USE_STD_STRING)
ListBox_AddString(hwndList, s.c_str());
#elif defined(PPHACK_USE_CSTRING)
ListBox_AddString(hwndList, static_cast<char const *>(s));
#elif defined(PPHACK_USE_CUSTOM_TYPE)
#if !defined(PPHACK_ACCESS_CUSTOM_TYPE)
#error Must defined PPHACK_ACCESS_CUSTOM_TYPE with custom type
#endif /* !PPHACK_ACCESS_CUSTOM_TYPE */
ListBox_AddString(hwndList, PPHACK_ACCESS_CUSTOM_TYPE(s));
#else
#error Must specify recognised PPHACK_USE_*** selector
#endif /* type */
}