我很确定以下问题的解决方案是非常标准的,但是我找不到正确的术语来搜索。我有两个类,比如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的实例)以进行有效过滤。

10-08 20:17