自動變化的C++ 03 stateful 方案
有的技術早被發明了,也不依賴C++11,卻為何成為莫名膜拜C++11的依據?讓你的模版編程中,有「變數」可用吧
前一個文章里我已經把我的stateful 方案說的很詳細了,但是有人懟我,說我的方案無法做到automatic state change after evaluation, 需要手工去修改常量表達式的結果
搞什麼,函數重載也能叫stateful template metaprogramming??
我費了很多口舌說這東西沒有多少意義,明明可以好好的手工指定常量表達式結果值非得要預先設定。。算了不爭了,既然有這樣的需求,作為技術人員我給他實現出來就行了,而且確實對於諸如模版參數列表這些地方,沒有辦法聲明函數重載來修改表達式結果。晚上聚餐完打了個牌賺了點小錢,於是就半夜回家的時候隨手實現了。
注意VC和GCC在友元聲明的處理上稍微有些小區別,所以稍微做了些適配的工作。
template<unsigned int N>nstruct struct_int : struct_int<N - 1> {ntconst static unsigned int count = N;n};ntemplate<>nstruct struct_int<0> {ntconst static unsigned int count = 0;n};nn#define MAX_COUNT 168 // you can increase the number if your compiler affordablenn#ifdef _MSC_VERnnchar (*auto_counter(...))[0+1];nn#define EVAL_COUNTER (sizeof(*(auto_counter((struct_int<MAX_COUNT>*)0))) - 1)nntemplate<unsigned int N>nstruct eval_counter{nt static const unsigned int value = N;nt static const unsigned int next_value = value + 1;t nt friend char (*auto_counter(struct_int<next_value>*))[next_value + 1];n};nn#elsenntemplate<int M>nchar (*auto_counter(...))[0+1];nn#define EVAL_COUNTER (sizeof(*(auto_counter<0>((struct_int<MAX_COUNT>*)0))) - 1)nntemplate<unsigned int N>nstruct eval_counter{nt static const unsigned int value = N;nt static const unsigned int next_value = value + 1;nt template<int M>nt friend char (*auto_counter(struct_int<next_value>*))[next_value + 1];n};n#endifnn#include <stdio.h>nint main(){ntunsigned int i = eval_counter<EVAL_COUNTER>::value;t//i = 0ntunsigned int j = eval_counter<EVAL_COUNTER>::value; //j = 1ntunsigned int k = eval_counter<EVAL_COUNTER>::value; //k = 2ntprintf("%u%u%un", i, j, k);n return 0;n}n
這樣就實現了需求中的,求值時全局自動變化,不在局部作用域中聲明函數的state change. 當然這個狀態的只能按照已知的自增方式進行變換,要指定的話得給eval_counter加個參數。我向來不是給讀者大包大攬的,讀者有興趣可以自己下去實現(說實在話的,本文內容前文我基本上已經介紹清楚了,奈何還是有讀者未能理解我的主旨)。
@孫明琦 歡迎多多指教啦。
推薦閱讀:
※如何實現在C++編譯期檢查tuple的空間布局順序是否達到了最省內存的目標?
※玩模板元編程走火入魔是一種怎樣的體驗?
※如何用c++ template 解決這個需求?