代码之家  ›  专栏  ›  技术社区  ›  Alexander Daum

模板参数中对模板类型的引用

  •  0
  • Alexander Daum  · 技术社区  · 7 年前

    如果我有一个模板类a,像这样

    template <int n>
    class A{
        /* some code */
    };
    

    是否可以有一个模板类B,它将指向a的引用或指针作为参数,而不将int n作为B中的模板参数。

    以下代码将起作用:

    template <int n, A<n> &a>
    class B{
        /* some code */
    };
    

    但要使用它,我总是必须向B提供2个参数,这会起作用,但很不方便。

    在c++17中,使用auto的工作方式如下

    template <auto &a>
    class B{
        /* some code */
    };
    

    但我必须使用arm none eabi gcc,它显然不支持c++17。

    所以我想知道,是否有其他方法可以创建这样的模板,这样B只需要1个模板参数。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Henri Menke    7 年前

    如果我理解正确,那么目标是得到 A 并确保 B 是实例化的,实际上是 A. 。通过定义自己的类型特征,您可以通过一些简单的元编程来实现这一点 A.

    #include <type_traits>
    
    template <int n>
    class A {};
    
    template <typename T>
    struct is_A : std::false_type {};
    
    template <int m>
    struct is_A<A<m>> : std::true_type {
        static constexpr int const n = m;
    };
    
    template <typename A>
    class B {
        static_assert(is_A<A>::value,"!");
        static constexpr int const n = is_A<A>::n;
    };
    
    int main() {
        B<A<1>>{};
    }
    

    Live example