gpt4 book ai didi

c++ - 如何使用模板处理不同维度的矩阵?

转载 作者:行者123 更新时间:2023-11-30 05:06:59 26 4
gpt4 key购买 nike

我想实现矩阵到字符串的转换,不管它的大小、类型或维度。通过使用模板,我已设法通过为我需要的每种“类别”矩阵定义一个模板来使其工作。

数组模板:

template < typename NUM, std::size_t SIZE >
std::string to_string( const std::array< NUM, SIZE > &arr ) {

std::string buf;
for ( uint32_t i = 0; i < SIZE; i++ )
buf += std::to_string( arr[i] ) + " ";

return buf;
}

二维矩阵模板:

template < typename NUM, std::size_t INNER_SIZE, std::size_t OUTER_SIZE >
std::string to_string( const std::array< std::array<NUM, INNER_SIZE>, OUTER_SIZE > &arr ) {

std::string buf;

for ( uint32_t i = 0; i < OUTER_SIZE; i++ ) {
for ( uint32_t j = 0; j < INNER_SIZE; j++ )
buf += std::to_string( arr[i][j] ) + " ";
}

return buf;
}

但是,我想让解决方案更“优雅”,只需要一个可以处理矩阵而不管其维度如何的通用模板。有什么办法吗?

最佳答案

首先:我强烈建议避免为您的函数指定与标准函数相同的名称。因此,在下面的示例中,我重命名了 fooString() 您的函数以避免与 std::to_string 发生冲突的风险。

其次:正如 Bob__ 所观察到的,如果您将内部循环替换为对 to_string(arr[i]) (fooString(arr[i]) 的调用,通过我的重命名),您可以递归地解决多维(对于每个维度)数组的问题。

第三:我建议编写一个基础案例,为单个值获取 std::to_string()(其中 T 是基本(而非数组)类型,如 intfloat 等)

template <typename T>
std::string fooString (T const & val)
{ return std::to_string(val); }

递归情况变为

template <typename T, std::size_t Dim>
std::string fooString (std::array<T, Dim> const & arr)
{
std::string buf;

for ( auto const & elem : arr )
buf += fooString( elem ) + " ";

return buf;
}

对于处理基本类型的基本情况,您有更多的间接级别(因此性能可能会更差一点)但是数组管理的逻辑仅在一个函数中而不是在两个函数中几乎相等(错误更少易于维护代码)。

以下是一个完整的 C++11 示例

#include <array>
#include <string>
#include <iostream>

template <typename T>
std::string fooString (T const & val)
{ return std::to_string(val); }

template <typename T, std::size_t Dim>
std::string fooString (std::array<T, Dim> const & arr)
{
std::string buf;

for ( auto const & elem : arr )
buf += fooString( elem ) + " ";

return buf;
}

int main()
{
std::array<std::array<std::array<int, 2U>, 3U>, 4U> a3dim
{{ {{ {{ 2, 3 }}, {{ 5, 7 }}, {{ 11, 13 }} }},
{{ {{ 17, 19 }}, {{ 23, 29 }}, {{ 31, 37 }} }},
{{ {{ 41, 43 }}, {{ 47, 53 }}, {{ 59, 61 }} }},
{{ {{ 67, 71 }}, {{ 73, 79 }}, {{ 83, 89 }} }} }};

std::cout << fooString(a3dim) << std::endl;
}

关于c++ - 如何使用模板处理不同维度的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47696559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com