我有這樣的代碼:
template<class Command>
void registerCmd() {
Command x{};
// do something with x...
}
namespace Cmd
{
struct GET { /* some methods */ };
struct GETSET { /* some methods */ };
struct DEL { /* some methods */ };
void registerCommands() {
registerCmd<GET>();
registerCmd<GETSET>();
registerCmd<DEL>();
}
}
我喜歡代碼的結果。我想知道是否有辦法將此代碼更改為以下內容:
namespace Cmd
{
void register() {
// this does not compile
for (TYPE in{ GET, GETSET, DEL })
registerCmd<TYPE>();
}
}
可能與可變引數模板一起使用?
uj5u.com熱心網友回復:
您不能在基于范圍的 for 回圈中擁有不同型別的集合,除非您將它們放在 陣列std::variant或std::any此型別別中。
如果您愿意registerCommands使用折疊運算式(因為C 17)你可能會這樣做(假設數字型別在編譯時是已知的):
template<typename... Types>
void registerCommands() {
(registerCmd<Types>(), ...);
}
和函式呼叫
Cmd::registerCommands<Cmd::DEL, Cmd::GETSET, Cmd::GETSET>();
現場演示
uj5u.com熱心網友回復:
澄清,可能會幫助別人。
原來,模板模板類是這樣的:
template<
template<class, class> class Cmd,
class Protocol,
class DBAdapter,
class Storage,
class Map
>
void registerCmd(Storage &s, Map &m){
//...
}
我仍然可以通過以下方式進行折疊:
template<
class Protocol,
class DBAdapter,
class Storage,
class Map,
template<class, class> typename... Commands
>
void registerCommands(Storage &s, Map &m){
( registerCmd<Commands, Protocol, DBAdapter>(s, m), ... );
}
這就是我所說的:
struct SET { /* some methods */ };
struct SETEX { /* some methods */ };
struct SETNX { /* some methods */ };
struct DEL { /* some methods */ };
struct GETSET { /* some methods */ };
struct EXPIRE { /* some methods */ };
registerCommands<Protocol, DBAdapter, Storage, Map,
SET ,
SETEX ,
SETNX ,
DEL ,
GETSET ,
EXPIRE
>(s, m);
以下是檔案的鏈接:
- https://github.com/nmmmnu/HM4/blob/master/net/worker/keyvaluecommands/base.h
- https://github.com/nmmmnu/HM4/blob/master/net/worker/keyvaluecommands/cmd_mutable.h
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489104.html
上一篇:沒有輔助型別的依賴型別
下一篇:工廠根據列舉值創建不同的型別c
