C++ 为什么';这个递归模板不起作用吗?
因此,我尝试创建一个简单的递归模板,以生成一个大但不重要的嵌套类型:C++ 为什么';这个递归模板不起作用吗?,c++,templates,C++,Templates,因此,我尝试创建一个简单的递归模板,以生成一个大但不重要的嵌套类型: #include <type_traits> #include <typeinfo> #include <boost/core/demangle.hpp> template <typename T> struct A {}; template <typename T, int N> struct Nest { using type = Nest<A&l
#include <type_traits>
#include <typeinfo>
#include <boost/core/demangle.hpp>
template <typename T>
struct A {};
template <typename T, int N>
struct Nest
{
using type = Nest<A<T>, N-1>
};
template <typename T>
struct Nest<T, 0>
{
using type = T;
};
int main()
{
typename Nest<A<int>, 20>::type x;
std::cout << boost::core::demangle(typeid(x).name());
};
#包括
#包括
#包括
模板
结构A{};
模板
结构巢
{
使用type=Nest
};
模板
结构巢
{
使用类型=T;
};
int main()
{
typename嵌套::type x;
std::cout忘记了递归步骤:
template <typename T, int N>
struct Nest
{
using type = Nest<A<T>, N-1>::type
};
模板
结构巢
{
使用type=Nest::type
};
可能需要typename
--我现在没有访问编译器的权限。这是执行递归的最干净的方法,如下所示:
template <typename T>
struct A {};
template <typename T, unsigned N>
struct Nest:Nest<A<T>,N-1> {};
这是一个糟糕的答案。请在需要typename
的地方写下。初学者自己不会知道。根据我对规则的理解,typename
关键字是必需的,因为Nest
的模板参数强制假定:
在值之前。对吗?这是我的经验朋友,编译器之间的行为各不相同。不管给定的编译器是否在没有给定关键字的情况下接受它,都可能不能很好地表明它是正确的。我已经纠正了我严重的违规行为。一些最好的代码都写在餐巾纸的背面。真实的故事。嘿,当然:但是“为什么这段代码不起作用?”由于完全不相关的原因(打字错误!)而无法工作的代码通常会适得其反
template <typename T>
struct A {};
template <typename T, unsigned N>
struct Nest:Nest<A<T>,N-1> {};
template <typename T>
struct Nest<T, 0> {
using type = T;
};
template <typename T, unsigned N>
using Nest_t = typename Nest<T,N>::type;
int main() {
Nest_t<int, 20> x;
std::cout << boost::core::demangle(typeid(x).name());
};