如何设置嵌套模板参数

How to set-up nest template parameters?

本文关键字:嵌套 参数 设置 何设置      更新时间:2023-10-16

我目前正在开发一个带有模板类的C++项目。我以前做过,我知道模板是如何为单层模板参数工作的。但对于我当前项目中的类,我使用以下内容(重要提示:为了阅读目的,经过了大量简化)

template<typename T>
struct B{
B(){}
void bar();
};
template<int k>
struct A{
A(){}
void foo(); 
};
template class A<1>;
template class B< A<1> >;

只要我不调用foo()或bar(),它编译和运行都很好。现在,我知道如何使用为所有k编写void foo()的模板

template<int k>
void A<k>::foo(){
printf("foo %dn", k);
}

我知道我可以放

template<>
void B<A<1> >::bar(){
printf("A<1> barn");
}

其将为B<A<1>>。事情是这样的:我想为k使用多个值(k=1只是一个例子),而不必为所有情况复制以上内容。这就是为什么我也想为bar()编写一个模板。然而,

template<int k>
void B<A<k> >::bar(){
printf("Templated bar() for k=%dn", k);
}

不起作用。对于任何B<A>?在这种情况下,类A和B是在一个库(头)中交付的,我不允许更改,还有foo()和bar()有待实现。

您可以像这样部分专门化B

// this is unchanged
template<typename T>
struct B{
B(){}
void bar();
};
// but this is added by you
template <int k>
struct B<A<k>> {
void bar();
};

这将使您能够实现:

template <int k>
void B<A<k>>::bar() {
printf("A<k> barn");
}

并运行:

int main() {
B<A<3>> b{};
b.bar();
}

部分专门化是可以的(正如其他人所提到的),但您必须实现原始类B的所有成员。另一种方法是使用外部工具(本例中为A_traits)从A中提取k

template <typename>
struct A_traits;
template <int K>
struct A_traits<A<K>> : std::integral_constant<int, K> {};

您的实现几乎没有变化,只需使用A_traits提取k即可。

template <typename T>
void B<T>::bar() {
printf("Templated bar() for k=%dn", A_traits<T>::value);
}