c++ - 如何设置嵌套模板参数?
问题描述
我目前正在开发一个带有模板类的 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() 留待实现。
解决方案
您可以像这样部分专业化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();
}
推荐阅读
- python - 如何从连接矩阵中绘制图像?
- javascript - 我们如何在 Angular 2+ 的模块中发送数据
- reactjs - 使用“componentDidMount()”重定向:问题(React)
- java - 我怎样才能修复我的进度并寻找滑块以适用于所有媒体?
- solidity - rinkeby etherscan 中的代币余额显示为 0
- c - gcc -O 会对链接的静态库生效吗?
- php - 在 laravel 路由文件中获取当前用户名而不从控制器传递
- javascript - 在 Javascript 中订购日历事件列表并添加月份名称
- c# - 将带有点 (.) 的 XML 标记映射到 C# 对象
- vaadin - Vaadin 12 项目中的 FabricJS