【问题标题】:How to remove this kind of duplication (for cycle over types)?如何删除这种重复(用于循环类型)?
【发布时间】:2022-06-10 17:40:45
【问题描述】:

我有这样的代码:

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>();
    }
}

可能与可变参数模板一起使用?

【问题讨论】:

    标签: c++ templates c++17 variadic-templates function-templates


    【解决方案1】:

    您不能在基于范围的 for 循环中包含不同类型的集合,除非您将它们放在 std::variantstd::any 或此类类型的数组中。

    如果您愿意将具有可变参数模板参数的registerCommands 模板函数作为模板参数,那么您可以在fold expression(因为)的帮助下这样做(假设数字类型在编译时就知道了):

    template<typename... Types>
    void registerCommands() {
        (registerCmd<Types>(), ...);
    }
    

    和函数调用

    Cmd::registerCommands<Cmd::DEL, Cmd::GETSET, Cmd::GETSET>();
    

    Live Demo

    【讨论】:

    • 这些是多态类。我确信用 fold 或类似的东西会很容易,但我从未见过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多