如何设置嵌套模板参数
How to set-up nest template parameters?
我目前正在开发一个带有模板类的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);
}
相关文章:
- 嵌套参数包扩展失败
- 嵌套定义与定义的参数 C++
- 如何避免嵌套模板中的模板参数重复
- 重构模板类,该类将其嵌套类用作另一个类的模板参数
- 以嵌套类为参数的友元模板声明
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 嵌套模板类的模板类模板模板参数的专业化
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 声明嵌套在模板参数中的类型的变量?
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 模板嵌套类模板类作为与完全专业函数的参数
- C++ 17 可以处理嵌套的可变参数模板吗?
- 带有可变参数的嵌套宏在GCC中编译,但在MSVC中不编译
- 在C++中使用模板类的嵌套类作为模板模板参数
- 如何使用variadic参数包的嵌套模板类
- 如何在variadic模板中采用嵌套参数包
- 传递具有依赖嵌套参数类型的模板模板参数时出错
- gcc segfault在编译嵌套参数包代码上