如何设置嵌套模板参数?

时间:2019-01-19 23:11:01

标签: c++ templates

我目前正在使用模板化类进行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 %d\n", k);
}

我知道我可以放

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

这将为B >实现bar()。事情是这样的:我想对k使用多个值(k = 1只是一个示例),而不必在所有情况下都复制上面的值。这就是为什么我也想为bar()编写模板。但是,

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

不起作用。对于任何B 来说,模板bar()的确切模板声明必须是什么?在这种情况下,A类和B类在一个库(标头)中提供,不允许更改,并且还有foo()和bar()可以实现。

2 个答案:

答案 0 :(得分:1)

您可以像这样对html, body { margin: 0; height: 100%; } html { display: table; } body { background-color: #0000ff; display: table-row; overflow: hidden; } aside { background-color: #00ff00; display: table-cell; } header { background-color: #909090; } main { background-color: #ffffff; height: 100%; }进行部分专业化:

<html>
  <body>
    <aside>ASIDE</aside>
    <header>HEADER<br>AND SOME CONTENT</header>
    <main>MAIN</main>
  </body>
</html>

这将使您能够实现:

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();
};

答案 1 :(得分:1)

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

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=%d\n", A_traits<T>::value);
}