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