如何删除这种重复(对于循环类型)?

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)

可以使用可变参数模板吗?

JeJ*_*eJo 3

您不能在基于范围的 for 循环中拥有不同类型的集合,除非它们位于std::variant,std::any或此类类型的数组中。

如果您愿意在折叠表达式(自registerCommands起)的帮助下创建以可变模板实参作为模板参数的模板函数,您可以这样做(前提是在编译时已知数字类型):

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)

现场演示