c++ - 如何在 C++ 中生成任意嵌套的 vector ?

标签 c++ c++11 templates vector c++17

在 C++ 中,是否可以生成深度(维度)等于用户定义输入的嵌套 vector ?例如,如果用户输入一个值为 2 的整数,程序可能会创建一个类型为 vector< vector< vector<int> > > 的对象。 .显然,在 C++ 中还有许多其他方法可以轻松实现类似的行为,但我纯粹感兴趣的是是否可以实际生成任意嵌套的 vector 。最初,我认为这会很微不足道,但我的实现都以相当奇怪的方式失败了。

#include<iostream>
#include<vector>

using namespace std;

template<typename A> void vec_print(vector<A> in){
    cout << "{";
    for(typename vector<A> :: iterator i = in.begin(); i != in.end(); ++i){
        cout << *i << ", ";
    }
    cout << "}" << endl;
}

template<typename B> void vec_print(vector< vector<B> > in){
    cout << "{";
    for(typename vector< vector<B> > :: iterator i = in.begin(); i != in.end(); ++i){
        vec_print(*i); cout << ", ";
    }
    cout << "}" << endl;
}

template<typename T> auto generate(unsigned int d){
    if(d == 0){
        vector<T> in;
        return in;
    }
    return generate< vector<T> >(d - 1);
}

int main(){
    unsigned int d = 0;
    cin >> d;
    vec_print(generate<int>(d));
    return 0;
}

最初,我认为这可能有效,但考虑到我对 C++ 编译器如何处理模板函数的理解,我对此持怀疑态度。使用带有 --std=c++11 的 g++ 编译器标志,在崩溃之前,g++ 编译器递归地喷出错误,通知我函数返回类型推导仅在 C++17 规范下可用。试图用 --std=c++17 编译这个程序flag 没有导致错误,但编译器只是崩溃了。我怀疑编译器试图生成无限数量或可能 2^31 的模板函数,尽管我希望它能通过生成无限模板函数的错误警告来处理这个问题,而不是默默地死去。

最佳答案

该标准设置了嵌套模板实例化深度的限制 (1024),符合标准的程序不应超过。但是,不需要实现来强制或诊断此限制或任何其他实现限制。它可能无法编译任何“太大”的程序。

gcc 和 clang 都可以使用标志来设置用户定义的模板实例化深度限制。为了查看发生了什么,请使用

g++ -std-c++17 -ftemplate-depth-20 yourprogram.cpp >& gcc.log

并查看生成的日志文件有多大。然后将深度增加到 21 并再次进行。多做几次,然后将您的发现外推到 -ftemplate-depth-1024

当然,编译器崩溃是一个 QoI 问题,应该被视为一个错误。尽管如此,您的程序还是不合格,因为它超出了实现数量。

如果要处理任意维数的 vector ,则不能使用递归模板。您必须求助于需要在运行时而非编译时设置维度的其他技术。

关于c++ - 如何在 C++ 中生成任意嵌套的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47130773/

相关文章:

c++ - 如何通过传递命名函数为 unordered_set 显式指定自定义哈希函数?

multithreading - <thread> get_id() 和 native_handle() 之间的 C++11 区别

C++ 模板 : Error while instantiate object

c++ - 使用 extern 声明创建头文件有什么意义?

c++ - 错误 : invalid conversion from ‘void*’ to ‘void* (*)(void*)’ - pthreads

c++ - 在 RHEL 5.7 上链接 libstdc++ 问题

c++ - C++ 中的 AND 短裤

java - C++ 中的模板继承(移植 Java 代码)

Android NDK 中的 C++ 模板

C++ 和类型特征 : simplest way of defining a list of possible definitions