C++ C++;简单模板递归

C++ C++;简单模板递归,c++,templates,recursion,C++,Templates,Recursion,我非常确定以下问题的解决方案是相当标准的,但我找不到合适的术语来搜索它。我有两个类,比如,SomeB和SomeA。我想创建SomeB的一个实例,其中A:=SomeA和B:=SomeB。(简化)代码如下所示: template<typename A> class SomeB { A getA() { /* ... */ } }; template<typename B> class SomeA { B getB() { /* ... */ } }; in

我非常确定以下问题的解决方案是相当标准的,但我找不到合适的术语来搜索它。我有两个类,比如,
SomeB
SomeA
。我想创建
SomeB
的一个实例,其中
A:=SomeA
B:=SomeB
。(简化)代码如下所示:

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;
}
模板
类SomeB
{
一个getA(){/*…*/}
};
模板
某类
{
B getB(){/*…*/}
};
int main(int argc,字符**argv)
{
SomeA试验;
//                       /\
//                        |
//+----递归
test.getB();
返回0;
}

现在,我如何告诉编译器在
SomeA
中没有类似的“惊喜”?

多亏了维托里奥·罗密欧为我指出了模板参数。这一个编译并运行:

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
{
公众:
getA(){返回A();}
};
模板
某类
{
公众:
B getB(){返回B();}
};
int main(int argc,字符**argv)
{
SomeB试验;
test.getA();
返回0;
}

为好奇的人提供的元信息:SomeB是一个树(节点)类,SomeA是一个在树中查找节点的特定子级的类。SOA可以以多种不同的方式实现,它可以使用自己的数据结构来存储子,即,用于高效过滤的SONB实例。

让我们把一个相当笨拙的C++符号转换成一个更类型的(ISH)符号,这样我们就可以尝试清楚地定义你想要的。

template<typename A> class SomeB { ... };
例如,如果您有这样的“模板参数”:

template<template<typename> class A> class SomeB { ... };
现在我明白你想要什么了。你说“我这里有两个人”

“如果我想像
SomeA
那样应用,那是非法的,因为
SomeB
不是
typename
——它是
typename->typename
。我要是能把
SomeB
应用到某个东西上,得到一个简单的类型就好了

哦!我像
SomeB
那样应用它怎么样?不,那是非法的,因为
SomeB
不是
typename
——它是
typename->typename
。如果我能把
SomeA
应用到某个东西上,得到一个简单的类型

哦!我像
SomeA
那样应用它怎么样?不,那是非法的,因为
SomeA
不是
typename
——它是
typename->typename
。如果我能把
SomeB
应用到某个东西上,得到一个简单的类型

哦!我像
SomeB
那样应用它怎么样?不,那是非法的,因为
SomeA
不是
typename
——它是
typename->typename
。我要是能把
SomeB
应用到某个东西上,得到一个简单的类型就好了……”

诸如此类,你知道了。这和所有经典的逻辑悖论非常相似,比如。更正式地说,你想做的事情被称为

你猜怎么着?由伯特兰·罗素(Bertrand Russel)设计,完全是为了破坏不确定性


因此,你的意图不仅仅是与使用C++表达自己的能力发生冲突,它与类型理论的基本思想冲突。而且,在我看来,这毫无意义。比如说谎者悖论

你的概念没有意义。@ CaskOb:哪个概念?抱歉,但是直接递归类型不能在C++中定义。OP试图对模板模板参数进行解释的概念很抱歉,但我看起来不像你在这个问题中描述的东西。我的意思是
SomeB测试中的
SomeA
是一个模板。它不是你想要的那种类型。@Kostya:Touché!不过,我很确定它解决了我的问题。如果我知道模板参数,我会问不同的问题。我肯定有一个关于这个的xkcd。。。
template<template<typename> class A> class SomeB { ... };
SomeB : (typename -> typename) -> typename
SomeA : typename -> typename
SomeB : typename -> typename