Nic*_*ick 5 c++ templates function-templates variadic-templates c++17
我有这样的代码:
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>();
}
}
Run Code Online (Sandbox Code Playgroud)
我喜欢代码的结果。我想知道是否有办法将此代码更改为如下所示:
namespace Cmd
{
void register() {
// this does not compile
for (TYPE in{ GET, GETSET, DEL })
registerCmd<TYPE>();
}
}
Run Code Online (Sandbox Code Playgroud)
可以使用可变参数模板吗?
您不能在基于范围的 for 循环中拥有不同类型的集合,除非它们位于std::variant,std::any或此类类型的数组中。
如果您愿意在折叠表达式(自c++17registerCommands起)的帮助下创建以可变模板实参作为模板参数的模板函数,您可以这样做(前提是在编译时已知数字类型):
template<typename... Types>
void registerCommands() {
(registerCmd<Types>(), ...);
}
Run Code Online (Sandbox Code Playgroud)
和函数调用
Cmd::registerCommands<Cmd::DEL, Cmd::GETSET, Cmd::GETSET>();
Run Code Online (Sandbox Code Playgroud)