gpt4 book ai didi

c++ - 使用 constexpr 在编译时初始化指向成员函数的指针数组

转载 作者:行者123 更新时间:2023-11-28 00:04:17 24 4
gpt4 key购买 nike

我想写下面的代码但是得到了一个错误“没有匹配转换函数'handler'到类型'void (struct Parser::*)()”。我使用 g++ 5.3.1 和选项 -std=c++14

使用 -std=17 我可以使用 consrexpr T& std::array::operator[] (...) 但现在我写了我的类数组。

这段代码有什么问题?

#include <cstddef>
template <typename T, size_t _size> struct array {
T elements[_size];
constexpr size_t size() const noexcept { return _size; }
constexpr bool empty() const noexcept { return size() == 0; }
constexpr T& operator[](size_t index) noexcept { return elements[index]; }
};

struct Parser {
template <size_t index> void handler ();
};

template<> void Parser::handler<0> () {
}

template<> void Parser::handler<1> () {
}


constexpr auto createArrayHandlers () {
array <void (Parser::*)(), 2> ans{&Parser::handler<0>, &Parser::handler<1>};
for (size_t i = 0; i < ans.size(); ++i) {
ans[i] = &Parser::handler<0>; //ok
ans[i] = &Parser::handler<i>; //error
}
return ans;
}
constexpr auto table = createArrayHandlers();
int main() {
//table[parse_cmd(read_from_socket())]();
return 0;
}

现在我用下面的代码替换了这段代码,但它在运行时执行

std::array<void (Parser::*)(), xxx> table {};
template <size_t i> size_t fillMemeberHandlerArray () {
fillMemeberHandlerArray<i-1>();
table[i] = &Parser::handler<i>;
return i;
}

template<> size_t fillMemeberHandlerArray<0> () {
table[0] = &Parser::handler<0>;
return 0;
}
size_t const initTable = fillMemeberHandlerArray<table.size () - 1>();

最佳答案

#include <utility>
#include <array>

namespace detail {
template<std::size_t... Is>
constexpr auto createArrayHandlers(std::index_sequence<Is...>) noexcept
-> std::array<void(Parser::*)(), sizeof...(Is)>
{
return {{&Parser::handler<Is>...}};
}
}

constexpr auto createArrayHandlers() noexcept
{
return detail::createArrayHandlers(std::make_index_sequence<2>{});
}

constexpr auto table = createArrayHandlers();

Online Demo

因为这不使用 operator[]填充它的容器,这适用于 std::array<>而不是自己滚动近似值。

关于c++ - 使用 constexpr 在编译时初始化指向成员函数的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36616438/

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