1樓:夏洋
如果你用C++11的話,直接這麼寫就行了:
class
UserClass
:Base
};甚至你想只寫成一句 DefValues(i, j, k); 也是有辦法的。例如:
#define FIRST(a, ...) a
#define SECOND(a, b, ...) b
#define EMPTY()
#define DEFER1(m) m EMPTY()
#define DEFER2(m) m EMPTY EMPTY()()
#define EVAL(...) EVAL32(__VA_ARGS__)
#define EVAL32(...) EVAL16(EVAL16(__VA_ARGS__))
#define EVAL16(...) EVAL8(EVAL8(__VA_ARGS__))
#define EVAL8(...) EVAL4(EVAL4(__VA_ARGS__))
#define EVAL4(...) EVAL2(EVAL2(__VA_ARGS__))
#define EVAL2(...) EVAL1(EVAL1(__VA_ARGS__))
#define EVAL1(...) __VA_ARGS__
#define IS_PROBE(...) SECOND(__VA_ARGS__, 0)
#define PROBE() ~, 1
#define CAT(a,b) a ## b
#define NOT(x) IS_PROBE(CAT(_NOT_, x))
#define _NOT_0 PROBE()
#define BOOL(x) NOT(NOT(x))
#define IF_ELSE(condition) _IF_ELSE(BOOL(condition))
#define _IF_ELSE(condition) CAT(_IF_, condition)
#define _IF_1(...) __VA_ARGS__ _IF_1_ELSE
#define _IF_0IF_0_ELSE
#define _IF_1_ELSE(...)
#define _IF_0_ELSE(...) __VA_ARGS__
#define HAS_ARGS(...) BOOL(FIRST(_END_OF_ARGUMENTS_ __VA_ARGS__)())
#define _END_OF_ARGUMENTS_() 0
#define MAP(m, first
m(first
IF_ELSE(HAS_ARGS(__VA_ARGS
; DEFER2(_MAP)()(m, __VA_ARGS__) \
/* Do nothing, just terminate */\)
#define _MAP() MAP
#define DefValue(v) Value v = Value(this)
#define DefValues(...) \
EVAL(MAP(DefValue, __VA_ARGS__))
DefValues(a
,b,c
,d,e
,f,g
,h,i
,j,k
);等效於
Valuea=
Value
(this
);Valueb=
Value
(this);.
..Valuek=
Value
(this
);如果有興趣,請學習魔法。
C 的建構函式與析構函式?
關於C 的問題,你的心中要有兩個概念,乙個是記憶體的分配,二是記憶體的初始化。C 的建構函式有兩個作用 第一,你必須要有乙個建構函式,compiler才會去給你分配記憶體。第二,分配了記憶體之後,再用建構函式去初始化記憶體。函式體為空,因為類中的每乙個成員都有預設建構函式和析構函式 否則是無法編譯的...
C 中,既然有了建構函式, 那麼拷貝建構函式存在的意義是?
白白小白 copy constructor 建立物件的時候,用同一類的物件對它進行初始化的時候會自動呼叫拷貝建構函式。Aa Ab a 或者傳參Ab f b 或者返回值是物件Af 語法 public A constA a 我們首先希望傳參的時候不會對原來的物件產生修改,所以使用了const型別 避免迴...
沒有呼叫拷貝建構函式卻提示呼叫了隱式的拷貝建構函式?
Furion W 在newNode.ptr new Node std move data 中,Node的初始化列表裡發生了這次拷貝構造 data std move std make shared std move data make shared C Reference Allocates and ...