c 17可否實現以下功能

時間 2021-09-09 02:33:07

1樓:CircleSir233

可以嘗試使用柯里化,把f(a, b, c, d)的呼叫變成f(a)(b)(c)(d),這樣只需要使用迴圈每次傳入乙個引數即可。

#include

#include

#include

#include

template

...>

struct

Curry

;template

Ret>

struct

Curry

operator

Ret()

};template

Ret,

typename

First

,typename

...Others

>struct

Curry

First

,Others

...>

Curry

Others

...>

operator

()(First

arg));}

template

FirstArg

,typename

SecondArg

,typename

...OtherArgs

>auto

operator

()(FirstArg

first

,SecondArg

second

,OtherArgs

...otherArgs)};

template

Ret,

typename

...Args

>Curry

Args

...>

makeCurry

(std

::function

Args

...)

>function

)template

Ret>

Retcall

(Curry

curryFunc

,std

::vector

any>::

iterator

unused

)template

Ret,

typename

First

,typename

...Others

>Retcall

(Curry

First

,Others

...>

curryFunc

,std

::vector

any>::

iterator

args

)int

main();

std::

cout

<

)(3)(4

)(5)(6

)<

endl

;// 18

std::

cout

<

)(3,4

,10.1)(6

)<

endl

;// 23.1

std::

vector

any>

args=;

std::

cout

<

(makeCurry(f

),args

.begin

())<<

std::

endl

;// 11.4}

2樓:rayhunter

好問題,元程式設計愛好者嘗試回答,只是這個功能,C++11就可以實現,純造輪子,不借用標準庫功能,比如tuple,make_index_sequence

模板元程式設計中有乙個比較重要的核心思想是:型別T不是簡單只修飾引數或變數,而是作輸入與變換,儲存及輸出,換句話說,就是一些沒有定義一些沒有成員輔助類,對輸入T進行處理,純粹編譯期處理型別。

myFunctions可以就用來的templatevoid myFuncion(T*... param)宣告即可,T...還是Call的T...

型別,我們需要一些手段儲存型別與轉換型別。

TypeList儲存可變型別

GetTypeListTypeHelp提取第N個型別

TL_N_Type_Point重定義一下,提取第N個型別的指標

SeqIndex,MakeSeq序列與序列生成器,這個受限遞規層次限制,沒有C++14的內建的make_index_sequence,index_sequence強。

myFuncionHelp關鍵輔助函式,主要用來將儲存好的TypeList型別序列提取出第N個型別作myFunctions模板引數,及將型別和Vec[N]引數包展開,這個函式設計完我非常開心!!!

// by Rayhunterli

// 2021/9/7

#include

#include

class

A{};

class

B{};

class

C{};

class

D{};

class

E{};

class

F{};

template

...T

>void

myFuncion(T

*...

param

)// 型別列表

template

...T

>struct

TypeList

;template

T>struct

TypeList

;template

typename

...TN

>struct

TypeList

TN...

>:

public

TypeList

>;// 獲取型別列表

template

TList

,size_t

N>struct

GetTypeListTypeHelp

;template

TList

>struct

GetTypeListTypeHelp

>;template

TList

,size_t

N>using

TL_N_Type_Point

=typename

GetTypeListTypeHelp

>::

TypeOut*;

// 簡單序列

template

...N

>struct

SeqIndex

;template

...T

>struct

ConSeq

;template

size_t

...PN

>struct

ConSeq

,SeqIndex

>>:

public

SeqIndex

PN+1)...

>{};template

N>struct

MakeSeq

:public

ConSeq

<0>,typename

MakeSeq

::

Type

>{};template

<>struct

MakeSeq

<1>:

public

SeqIndex

<0>{};template

<>struct

MakeSeq

<0>:

public

SeqIndex

<>{};// 輔助函式

template

...T

,size_t

...N

>void

myFuncionHelp

(std

::vector

*>&rVec

,TypeList

>,SeqIndex

>)template

...T

>void

Call();

myFuncionHelp

(kVec

,FunTypeList

(),FunIndexType

());

}int

main

()喜歡給個贊,3Q!

3樓:lichray

這個問題有一處頗有意思的地方,就是 myFunction 的引數列表應該是什麼。它不能是 T*..., 因為 vec[0], vec[1], … 全是 void*.

不過標準庫正好有乙個 trait 可以把任何型別對映成 void ——std::void_t Walter E. Brown, 還是你厲害…

先把 myFunction 宣告成這樣:

template

...T>void

myFunction

(std

::void_t

*...

args

);編譯時展開下標 pack 這個問題在 C++17 裡需要寫乙個輔助函式。想寫的話可以參考一下 std::to_array - cppreference.

com. 這裡我記錄乙個在 C++20 裡特別簡單的寫法:

template

...T>void

call()(

std::

index_sequence_for

>());

// i want to trans the vec to the input prams of myFunction[&

]

...I

>(std

::index_sequence

>)(std::

index_sequence_for

>());

}利用 lambda 表示式可以帶模版形參列表的特點,通過立即呼叫自己繫結 std::index_sequence 實參。熟悉 Scheme 的話,會明白這就是乙個 let.

有了 index pack 就隨便了,可以直接展開乙個表示式,也可以配合 fold expression.

Fold expression 還可以用來實現 myFunction :

template

...T>void

myFunction

(std

::void_t

*...

args

)Compiler Explorer - C++ (x86-64 gcc 11.2)

4樓:無敵母豬佩

//// call.hpp

// template

//// Created by 楊永康 on 2021/8/23.

//#ifndef call_h

#define call_h

#include

#include

template

..._T

>void

create_vector

(std

::vector

shared_ptr

>>&v

,_T&&...x);

template

T>void

create_vector

(std

::vector

shared_ptr

>>&v

,T&&x

)});

}template

class

..._T

>void

create_vector

(std

::vector

shared_ptr

>>&v

,T&&x

,_T&&...y)

});create_vector

<_T...

>(v,std

::forward

<_T>(y

)...);

}template

<>void

create_vector

(std

::vector

shared_ptr

>>&v

){};

template

T>std::

ostream

&print

(std

::ostream&os

,std

::vector

shared_ptr

>>::

iterator

beg)

template

classT1,

class

..._T

>std::

ostream

&print

(std

::ostream&os

,std

::vector

shared_ptr

>>::

iterator

beg)

#endif

/* call_h */

//// main.cpp

// template

//// Created by 楊永康 on 2021/8/23.

//#include

#include"call.hpp"

struct S ;

int main(int argc, const char * argvinsert code here...

std::vector> p;

create_vector>(p,"abc",S(),);

print>(std::cout, p.begin());

return 0;}

如何評價C 17中的新特性fold expression?

不知道為啥這麼多人反對。雖然。有些複雜不直觀。而且功能不強大,還完全可以通過其他方式代替,同時其他方式的實現還可以完成更多的功能。但是至少這種方法寫起來稍微。短那麼一些。 原子筆 C 標準委員會,只需引入乙個別的指令碼語言,放預處理後編譯期前去解釋執行,就可以簡單解決這些各種問題 巨集的功能太弱,但...

C 17 有哪些值得注意的新特性?

努力保持清醒的 最近一向有關TIOBE 程式設計言語排行榜,C 好像不進反退,不知為什麼會是這樣呢。話說C 寫起來感覺很不錯嘛,不知我們什麼感覺。turbo c 是老古董了,是DOS時代的C言語編譯器。Visual c 主要是用來編譯c 的,當然對c言語也是相容的。不過個人主張不要用Visual c...

怎麼看待 C 17 眾多功能的流產?

nouness 我猜上面說asio效能爛的都是使用姿勢問題 如果你是單個io service配合多執行緒使用的,那恭喜你,效能和併發上不去是正常的,io service裡有個鎖,是這個東東導致單個io service併發無法隨著執行緒增加而增加 高併發的使用姿勢是多個io service配合多執行緒...