gpt4 book ai didi

C++14 constexpr static const std::array 初始化

转载 作者:行者123 更新时间:2023-11-30 04:01:26 39 4
gpt4 key购买 nike

这要长得多,但现在我发现发生了什么,它没有帮助。

简短摘要:

  1. 具有可变整数总和 < 64 的模板。
  2. 我们想知道整数的数量 + 最后一个整数必须重复多少次才能达到 >= 64 的总和。
  3. 我们希望以 constexpr const 静态数组 std::array 结束。

我在没有在类外声明静态成员的情况下遇到链接错误。在场时,Clang 正在发生段错误。

问题最终是我将函数定义为

<BitBranch, numberOfBranches> 

但是声明最终使用了 numberOfBranches 访问器方法

<BitBranch, branchCount()>

一个非常愚蠢的错误,但对我来说追踪起来并不明显。

我会将我的代码作为示例包含在内,以防有人觉得它有帮助。

使用 C++14:

/* Using -std=c++1y */

#include <array>
#include <cmath>

template
<class BitBranch,
uint64_t... BitLengths>
class BitBranchTree
{

统计包中有多少位被显式参数覆盖

      template <typename ...Ints>
constexpr static uint64_t countExplicitBits(
uint64_t bit_length,
Ints... bit_lengths )
{
return bit_length + countExplicitBits( bit_lengths... );
}

constexpr static uint64_t countExplicitBits(
uint64_t bit_length )
{
return bit_length;
}

计算有多少位需要额外的隐式参数

      constexpr
static

uint64_t

calculateImplicitBranches()
{
uint64_t remaining_bits = 64 - explicitBitCount;
uint64_t final_explicit_bit_length = explicitBranchLengths[ explicitBranchCount - 1 ];
uint64_t smaller_final_length = remaining_bits % final_explicit_bit_length;
uint64_t remaining_full_branches = remaining_bits / final_explicit_bit_length;
uint64_t implicit_branch_count = smaller_final_length ? remaining_full_branches + 1
: remaining_full_branches;

return implicit_branch_count;
}

初始化所需的最终阵列

      template <uint64_t... Indexes>
constexpr static std::array<BitBranch, sizeof...(Indexes)>
initializeBranches(
std::integer_sequence<uint64_t, Indexes...> )
{
return { initializeBranch( Indexes )... };
}

初始化最终数组的每个分支

      constexpr static BitBranch
initializeBranch(
uint64_t index )
{
uint64_t bit_length = ( index < explicitBranchCount )
? explicitBranchLengths[ index ]
: explicitBranchLengths[ explicitBranchCount - 1 ];

return BitBranch( bit_length );
}

成员变量/初始化

      constexpr static const uint64_t
explicitBranchCount = sizeof...(BitLengths);

constexpr static const uint64_t
explicitBitCount = countExplicitBits( BitLengths... );

constexpr static const uint64_t
explicitBranchLengths[ explicitBranchCount ] = { BitLengths... };

constexpr static const uint64_t
implicitBranchCount = calculateImplicitBranches();

static const uint64_t
numberOfBranches = explicitBranchCount + implicitBranchCount;

constexpr static const std::array <BitBranch, numberOfBranches>
branches = initializeBranches( std::make_integer_sequence <uint64_t, numberOfBranches>{} );
};

最后,类之外

    template
<class BitBranch,
uint64_t... BitLengths>

constexpr
const
std::array
<BitBranch,
BitBranchTree<BitBranch, BitLengths...>::numberOfBranches>

BitBranchTree<BitBranch, BitLengths...>::branches;

使用示例

typedef
BitBranchTree<BitBranchMock, 4, 16, 7, 8, 5, 2, 8, 12, 2>
CompleteSpecification; // Results in Branches: 4, 16, 7, 8, 5, 2, 8, 12, 2

typedef
BitBranchTree<BitBranchMock, 4, 16>
PartialSpecification; // Results in Branches: 4, 16, 16, 16, 12

最佳答案

您需要将 BitBranchTree::branches 的定义与声明相匹配,如下所示

template
<class BitBranch,
uint64_t... BitLengths>
constexpr const std::array <BitBranch, BitBranchTree<BitBranch, BitLengths...>::numberOfBranches>
BitBranchTree<BitBranch, BitLengths...>::branches;

您也可以更改声明以使用 branchCount(),重要的是它们是相同的。

大概是 clang 3.4 崩溃而不是由于编译器错误而给出错误,您的原始代码在 clang 3.5 上给出了以下错误

test.cpp:199:42: error: redefinition of 'branches' with a different type: 'array<[...], BitBranchTree<BitBranch, BitLengths...>::branchCount()>' vs
'const array<[...], numberOfBranches>'
BitBranchTree<BitBranch, BitLengths...>::branches;
^
test.cpp:181:7: note: previous definition is here
branches = initializeBranches( std::make_integer_sequence <uint64_t, numberOfBranches>{} );

关于C++14 constexpr static const std::array 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758832/

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