目的:包含0到任意個模板引數
宣告可變引數模板需要在typename或class 後面加上省略號「...」
一、可變引數模板函式
template
void f(t...args)
cout<
可變引數展開有兩種方式:
1.通過遞迴的模板函式來將引數展開
2.通過逗號表示式和初始化列表方式展開引數包
對於1介紹一種通過type_traits來展開並列印引數包,為什麼選用這個,因為很難,你看不懂?????
template
typename std::enable_if::value>::type printtp(tuple t)
template
typename std::enable_if::value>::type printtp(tuple t)
std::cout<(t)template
void print(args...args)
printtp(std::make_tuple(args...));
什麼玩意!!!!!!!!!!!!!!!
(2)逗號和初始化列表展開引數列表
template
void peintarg(t t)
cout<< t
void expand(args...args)
int arr = ;
expand(1,2,3,4);
這裡是通過乙個初始化列表來初始化乙個變長陣列,展開為((printarg(arg1),0)、((printarg2),0).....
int陣列的目的就是為了在陣列構造的過程展開引數包
改進,使用initializer_list來替代原來的int arr陣列
template
void expand(args...args)
std::initializer_list;
再改進,用lambda表示式:
template
void expand(args...args)
std::initializer_list;
optional(const t& v)
create(v);
optional(const optional& other)
if(other.isinit())
assign(other);
~optional()
destroy();
template
void emplace(args&& ...args)
destroy();
create(std::forward(args)...);
bool isinit() const
explicit operator bool() const // 這個bool符號過載,使用:if(***)來表示
return isinit();
t const& operator*() const
if(isinit())
else
destroy();
void copy(const data_t& val)
destroy();
new (&m_data) t(*((t*)(&val)));
private:
bool m_hasinit = false;
data_t m_data;
2.惰性求值
類似橋接模式,是在建立物件,呼叫成員函式才是真正的求值
下面再舉個例子,這個例子真的很吊的:
#include
template
struct lazy
lazy(){};
template
// 儲存函式
lazy(func& f, args&&...args)
;t& value()
if(!m_value.isinit())
m_value = m_func();
return *m_value;
bool isvaulecreated() const
return m_value.isinit();
private:
std::functionm_func;
optinalm_value;
template
lazy::type> lazy(func&& func, args&&...args)
return lazy::type>(std::forward(fun), std::forward(args)...); //這句呼叫 的就是上面的儲存函式
上面乙個函式是重要的函式,主要是為了更加方便地使用lazy,呼叫其建構函式:
int foo(int x)
return x*2;
int y =4;
auto lazyer = lazy(foo, y);
cout還可以通過bind繫結來將n元的入參函式變為std::function
m_func = std::bind(f, std::forward(args)...);
如果含有佔位符,則需要寫引數:
std::functionf = std::bind(&ht, std::placeholders::_1);
C 11可變引數函式模板
在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 include include using namespace std class logger static void makeloggeroff static bool loggerstate t...
C 11可變引數函式模板
2013 04 27 13 34 4162人閱讀收藏 舉報 c 模板 25 c c 84 在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 這個是今天剛讀到的,加上自己的理解為位元組寫了乙個logger類,也給大家瞧瞧啊,歡迎大蝦拍板轉 cpp vi...
c 11 可變引數模板類
可變引數模板類,如元組 template class tuple 遞迴和特化的方式展開引數包 可變引數模板類前向宣告 template struct sum 定義展開引數的可變引數模板類 template struct sum 可變引數模板類的特化,遞迴的終止類 template struct su...