我很确定以下问题的解决方案是非常标准的,但是我找不到正确的术语来搜索。我有两个类,比如SomeB<A>
和SomeA<B>
。我想创建一个SomeB<A>
实例,其中A:=SomeA<B>
和B:=SomeB<A>
。 (简化的)代码如下所示:
template<typename A>
class SomeB
{
A getA() { /* ... */ }
};
template<typename B>
class SomeA
{
B getB() { /* ... */ }
};
int main(int argc, char **argv)
{
SomeA<SomeB<SomeA<SomeB<...> > > > test;
// /\
// |
// +---- recursion
test.getB();
return 0;
}
现在,如何告诉编译器没有
SomeA<SomeB<SomeA<SomeB<Suprise_AnotherA<...>>>>>
中的“意外”? 最佳答案
感谢Vittorio Romeo向我指出模板模板参数。这是一个编译工作:
template<template<typename> class A>
class SomeB
{
public:
A<SomeB> getA() { return A<SomeB>(); }
};
template<typename B>
class SomeA
{
public:
B getB() { return B(); }
};
int main(int argc, char **argv)
{
SomeB<SomeA> test;
test.getA();
return 0;
}
对那些好奇的人的元信息:SomeB是树(节点)类,而SomeA是在树中找到节点的特定子级的类。 SomeA可以以许多不同的方式实现,并且它可以使用其自己的数据结构来存储子级(即SomeB的实例)以进行有效过滤。