首页 > 解决方案 > 如何设置嵌套模板参数?

问题描述

我目前正在开发一个带有模板类的 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(),它就可以编译并运行良好。现在,我知道如何使用 void foo() 为所有 k 编写模板

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

我知道我可以把

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

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

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

不起作用。对于任何 B < A >,模板 bar() 的确切模板语句必须是什么?在这种情况下,A 类和 B 类是在我不允许更改的库(标题)中交付的,并且 foo() 和 bar() 留待实现。

标签: c++templates

解决方案


您可以像这样部分专业化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> bar\n");
}

并运行:

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

    b.bar();
}

推荐阅读