AS>>Вот бы как-нибудь избавиться от этого оверхеда... я пока вижу только один вариант — списки типов и Const2Type, в этом случае размер строки будет с точностью до sizeof(DWORD), да и избавимся от ограничений на длину строки. Но как тогда формировать строку из списка типов, непонятно... Есть мысли?
__>Если их не будет это плохо
Ну, я не про те мысли. Я еще подумал, что хорошо сделать вариант с частичной специализацией, точнее то, что от нее оставляет VC.
Сначала я сделал так:
#define FLATTEN_STR(val) \
(TCHAR)HIBYTE(HIWORD(val)), (TCHAR)LOBYTE(HIWORD(val)), (TCHAR)HIBYTE(LOWORD(val)), (TCHAR)LOBYTE(LOWORD(val))
#define DECLARE_STR_DWORD(Name, Idx) \
static const TCHAR Name[] = {FLATTEN_STR(Idx##0), FLATTEN_STR(Idx##1), FLATTEN_STR(Idx##2), FLATTEN_STR(Idx##3), FLATTEN_STR(Idx##4), FLATTEN_STR(Idx##5), FLATTEN_STR(Idx##6), FLATTEN_STR(Idx##7)};
template <DWORD n0 = 0, DWORD n1 = 0, DWORD n2 = 0, DWORD n3 = 0, DWORD n4 = 0, DWORD n5 = 0, DWORD n6 = 0, DWORD n7 = 0>
struct CNameId
{
enum
{
name_size = 65,
m_n0 = n0,
m_n1 = n1,
m_n2 = n2,
m_n3 = n3,
m_n4 = n4,
m_n5 = n5,
m_n6 = n6,
m_n7 = n7
};
static LPCTSTR GetStr()
{
DECLARE_STR_DWORD(szBuffer, n);
return szBuffer;
}
};
В релизе это все оптимизируется. А также это позволяет при помощи частичной специализации оптимизировать длину массива, не изменяя внешнего интерфейса.