在另一个模板中推断一个模板的模板参数

Deducing template parameters of a template within another template

提问人:Jazzwave06 提问时间:9/5/2023 更新时间:9/5/2023 访问量:21

问:

我正在尝试在给定表达式中推断视图模板参数:

object<bool> object;
object<bool>::view view = object.make_view(std::string("compA"), std::string("compB"));

// instead of expliciting template parameters
// object<bool>::view<false, 2> view = object.make_view(std::string("compA"), std::string("compB"));

使用给定的代码:

template <typename owner_t>
struct object
{
    template <bool const_v, std::size_t component_v>
    struct view
    {
        using object_t = std::conditional_t<const_v, const object, object>;

        object_t& object;
        std::array<std::string, component_v> components;

        template <typename... components_t>
        inline view(object_t& object, components_t&&... components)
            : object(object),
                components {std::forward<components_t>(components)...}
        {
        }
    };

    template <typename... components_t>
    view(const object&, components_t&&...)
        -> view<true, sizeof...(components_t)>;

    template <typename... components_t>
    view(object&, components_t&&...)
        -> view<false, sizeof...(components_t)>;

    template <typename... components_t>
    inline auto make_view(components_t&&... components)
    {
        return view {
            *this,
            std::forward<components_t>(components)...,
        };
    }
};

它似乎适用于 clang,但不适用于 MSVC。如果我删除所有者模板参数并创建一个普通的非模板化类型,它将正确编译。有没有人遇到过这个问题,你有没有找到解决方案?object

编译器资源管理器的链接:https://godbolt.org/z/1Y46rY54T

C visual-c++ 模板-参数-演绎

评论

1赞 Jarod42 9/5/2023
可能的解决方法:不要使用内部结构 Demo

答:

1赞 463035818_is_not_an_ai 9/5/2023 #1

我承认,我不知道为什么或 msvc 拒绝您的代码是否正确,但这编译了:

auto vi = obj.make_view(std::string("compA"), std::string("compB"));

现场演示