参考模板参数

时间:2018-05-11 16:41:59

标签: c++ templates

如果我有模板类A,就像这样

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

是否可以使用模板类B,它将A作为参数的引用或指针,而不在B中使用int n作为模板参数。

以下代码可行:

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 个答案:

答案 0 :(得分:1)

如果我理解正确,那么目标是获取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