c 11 之可變引數模板

2021-07-15 18:41:27 字數 2613 閱讀 2639

目的:包含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...