代码之家  ›  专栏  ›  技术社区  ›  infinitezero

如何优化可变模板专业化?

  •  1
  • infinitezero  · 技术社区  · 3 年前

    假设您有以下结构来连接两个模板结构:

    /// concat.hpp
    template<typename...>
    struct concat_struct;
    
    // concat_specialization.hpp
    template<std::size_t... m, std::size_t... n>
    struct concat_struct<$CLASSNAME<m...>, $CLASSNAME<n...>>
    {
        using type = $CLASSNAME<m..., n...>;
    };
    
    template<typename a, typename b>
    using concat = typename concat_struct<a, b>::type;
    

    我现在可以做了

    #include "concat.hpp"
    #define $CLASSNAME MyClass
    #include "concat_specialization.hpp"
    #undefine $CLASSNAME
    #define $CLASSNAME MyOtherClass
    #include "concat_specialization.hpp"
    

    事实上,如果我再次包含“concat_specialisation.hpp”,这很容易导致冲突。C++如何处理可变模板的多种特殊化?

    0 回复  |  直到 3 年前
        1
  •  2
  •   cigien    3 年前

    你不需要明确地为每个项目写一个专业化 $CLASSNAME 。您只需将模板模板参数添加到专门化中,就会自动推断出来:

    template<template<std::size_t...> typename C, std::size_t... m, std::size_t... n>
    struct concat_struct<C<m...>, C<n...>>
    {
        using type = C<m..., n...>;
    };
    

    这是一个 demo