如何使一个函数具有三种不同的输出条件?

Posted

技术标签:

【中文标题】如何使一个函数具有三种不同的输出条件?【英文标题】:how to make one function with three different output conditions? 【发布时间】:2019-12-11 18:32:21 【问题描述】:

我正在尝试使用 new 实现动态数组,因为标准 std 库没有。 这是我的代码。

template <class T1, class T2, class T3>
auto auto_vector(T1& _Size, T2& _Size2, T3& _Size3) 
    auto result = new int64_t **[_Size3];
    for (ptrdiff_t i = 0; i < _Size3; ++i) 
        result[i] = new int64_t *[_Size2];
        for (ptrdiff_t k = 0; k < _Size2; ++k) 
            result[i][k] = new int64_t [_Size];
        
    
    return result;

这就是我删除数组的方式

template <class T1, class T2, class T3, class T4>
void del_vector(T4& _Del, T1& _Size, T2& _Size2, T3& _Size3) 
    for (ptrdiff_t i = 0; i < _Size3; ++i) 
        for (ptrdiff_t k = 0; k < _Size2; ++k) 
            delete _Del[i][k];
        
        delete _Del[i];
    
    delete _Del;

我可以用它来创建一个包含三个选项卡的多维数组。 像这样

auto tor3 = auto_vector(_Size, _Size2, _Size3);

但我也想创建其他带有两个或四个选项卡的数组,或者突然我需要创建一个 10x 多维数组。如果我突然失去理智 像这样

int _Size, _Size2, _Size3, _Size4, _Size5; 
_Size = _Size2 = _Size3 =_Size4 = _Size5 = 4;


auto tor2 = auto_vector(_Size, _Size2);

auto tor1 = auto_vector(_Size);

auto tor10 = auto_vector(_Size,_Size2,_Size3,_Size4,_Size5);

如何从我的函数中创建一个可以完成所有这些工作的函数,是否有可能做到这一点?

cout << " ---------TEST---------- " << endl;
    for (ptrdiff_t i = 0; i < _Size3; ++i) 
        for (ptrdiff_t k = 0; k < _Size2; ++k) 
            for (ptrdiff_t j = 0; j < _Size; ++j) 
                cout << _Tor[i][k][j] << " ";
            
            cout << endl;
        
        cout << endl;
    
    cout << " ---------TEST---------- " << endl;

【问题讨论】:

std::vector 使用 new,它只是包裹在 std::allocator 中。 @NathanOliver-ReinstateMonica 那么我应该如何使用向量创建多维数组。由于某种原因我没有成功,我创建了自己的:)。 最坏的情况,使用std::vector&lt;std::vector&lt;int&gt;&gt;。最好的情况下使用类似:***.com/a/53038618/4342498 你也可以使用***.com/a/43358434/4342498 还有boost::multi_array 【参考方案1】:

您可以使用可变参数模板来做到这一点

查看此链接:

https://eli.thegreenplace.net/2014/variadic-templates-in-c/

查看示例:

template<class T1>
auto auto_vector(T1&& _Size) 
    return new int64_t[_Size];


template <class T1, class... TT>
auto auto_vector(T1&& _Size, TT&&... r)

    auto result = new decltype(auto_vector(r...))[_Size];
    for (int64_t i = 0; i < _Size; ++i) 
        result[i] = auto_vector(r...);
    
    return result;


int main()

    auto x = auto_vector(2,2,2,2);

    return 0;

对于删除你做同样的方式

【讨论】:

虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。 有点困惑我不能用零初始化数组,我这样做return new int64_t[_Size]; 不幸的是,我还不能使用这段代码,也不知道如何用零初始化数组。我不知道如何像你一样编程:) 我想通了,我很笨,我不得不反方向添加。非常感谢您的示例运行良好,我会考虑现在如何实现删除。

以上是关于如何使一个函数具有三种不同的输出条件?的主要内容,如果未能解决你的问题,请参考以下文章

在c++中如何使每次输出的随机数不同?

Excel中,如何多条件判断,输出结果

使神经网络具有分层输出会更好吗?

如何从 Matlab 调用具有多个输出的 C++ 函数?

具有通用联合约束的 TypeScript 函数返回值

如果使用func()具有多个输出,如何获得函数输出的长度?