如果我有模板类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个模板参数。
答案 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>>{};
}