- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
// static_lit.h
#ifndef __STATIC_LIT__
#define __STATIC_LIT__
namespace
{
namespace Toast
{
namespace Detail
{
template<int UNIT_LOCAL_UID>
struct TUnitUniqueId
{
static int sGloballyUniqueVar;
};
template<int UNIT_LOCAL_UID>
int TUnitUniqueId<UNIT_LOCAL_UID>::sGloballyUniqueVar = 0;
}
}
}
#define GEN_UID_IMPL(line) &Toast::Detail::TUnitUniqueId<line>::sGloballyUniqueVar
//#define GEN_UID GEN_UID_IMPL(__LINE__)
#define GEN_UID GEN_UID_IMPL(__COUNTER__)
// В оригинале тут было __LINE__, однако в $тудии, сконфигурированной
// под билд в неком специфическом сдк, __LINE__ почему-то не опознавалось
// в качестве константы и не принималось в шаблон. Пришлось заменить её
// на менее портабельный, но работоспособный и, кстати, более уместный
// в этом качестве __COUNTER__.
template<class T,int* UID>
struct StaticLit
{
static T &Get (const char *str)
{
static T instance (str); // простейший случай для примера,
// вы без труда адаптируете его к использованию синглтонов
// и прочих премудростей
return instance;
}
};
#define SLTR_IMPL2(T,unique_id) StaticLit<T,unique_id>
#define SLTR_IMPL(T) SLTR_IMPL2(T,GEN_UID)
#define SLTR(T,str) (SLTR_IMPL(T)::Get (str))
#endif // __STATIC_LIT__
defecate-plusplus 31.01.2012 14:24 # +2
автор этим костылём решил проблему "а что если я не буду заводить на каждый строковый литерал отдельную переменную, а буду in-place создавать новый инстанс", сэкономил ручное кодирование, несколько замедлил по сравнению с переменной итоговую производительность/эффективность по памяти, но серьезно ускорил по сравнению с передачей ключа в виде голой строки
defecate-plusplus 31.01.2012 15:31 # +1
достаточно было нечто
TarasB 31.01.2012 16:22 # +1
bugmenot 31.01.2012 14:32 # +5
TarasB 31.01.2012 15:09 # +2
3.14159265 31.01.2012 15:24 # +6
Хех. Похоже на то.
>Смотря какое. Тут разные есть.
В сортах Гумна не разбираюсь.
Xom94ok 01.02.2012 12:42 # 0
TarasChlenodevka 18.06.2012 11:25 # −2