gpt4 book ai didi

C++ constexpr : Compute a std array at compile time

转载 作者:可可西里 更新时间:2023-11-01 18:27:51 27 4
gpt4 key购买 nike

我想将 bool 的“数组”转换为整数序列。所以我需要在编译时计算一个 std::array

这是我的代码

#include <array>

template<typename InputIt, typename T >
inline constexpr typename std::iterator_traits<InputIt>::difference_type
count( InputIt first, InputIt last, const T &value ) {
typename std::iterator_traits<InputIt>::difference_type ret = 0;
for (; first != last; ++first) {
if (*first == value) {
ret++;
}
}
return ret;
}

template<bool ..._values>
struct keep_value {
static constexpr std::size_t numberOfValues = sizeof...(_values);
static constexpr bool values[] = {_values...};
static constexpr std::size_t numberToKeep = count(values, values + numberOfValues, true);

static constexpr std::array<std::size_t, numberToKeep> computeIndices() {
std::array<std::size_t, numberToKeep> array{};
auto it = array.begin();
for(std::size_t i{0}; i < numberOfValues; ++i)
if(values[i] == true)
*it++ = i;

return array;
}

static constexpr std::array<std::size_t, numberToKeep> indices = computeIndices();

template<typename Indices = std::make_index_sequence<numberToKeep>>
struct as_index_sequence{};

template<std::size_t ...Is>
struct as_index_sequence<std::index_sequence<Is...>> : std::index_sequence<indices[Is]...>{};
};

int main() {
keep_value<false, true, true>::template as_index_sequence<>{}; // Should return the sequence 1 2
}

调用 computeIndices 函数的行出现错误。这段代码 c++14 正确吗?有没有可能不这样做?我正在使用 MSVC,但出现此错误:表达式未计算为常量

最佳答案

此代码在编译为 C++17 时看起来正确且有效。它使用 std::array::begin ,它仅在 C++17 中被制成 constexpr

using clang时可以实现更好的编译错误,其中指出:

<source>:23:25: note: non-constexpr function 'begin' cannot be used in a constant expression
auto it = array.begin();

关于C++ constexpr : Compute a std array at compile time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097211/

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