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

C++ 使用constexpr在编译时初始化指向成员函数的指针数组,c++,metaprogramming,std,c++14,constexpr,C++,Metaprogramming,Std,C++14,Constexpr,我想编写以下代码,但遇到一个错误“没有匹配项将函数“handler”转换为类型“void(struct Parser::*)()”。我使用带有选项-std=c++14的g++5.3.1 对于-std=17,我可以使用consrepr T&std::array::operator[](…),但现在我编写了我的类数组 这个代码有什么问题 #include <cstddef> template <typename T, size_t _size> struct array {

我想编写以下代码,但遇到一个错误“没有匹配项将函数“handler”转换为类型“void(struct Parser::*)()”。我使用带有选项-std=c++14的g++5.3.1

对于-std=17,我可以使用consrepr 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;
}
#包括
模板结构数组{
T元素[_大小];
constexpr size_t size()const noexcept{return_size;}
constexpr bool empty()const noexcept{return size()==0;}
constexpr T&运算符[](size_T index)noexcept{return elements[index];}
};
结构分析器{
模板void处理程序();
};
模板无效分析器::处理程序(){
}
模板无效分析器::处理程序(){
}
constexpr自动创建阵列处理器(){
数组ans{&Parser::handler,&Parser::handler};
对于(大小i=0;i
现在我用以下代码替换了这段代码,但它是在运行时执行的

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>();
std::数组表{};
模板大小\u t FillMemberHandleray(){
FillMemeberHandleray();
表[i]=&Parser::handler;
返回i;
}
模板大小\u t FillMemberHandleray(){
表[0]=&Parser::handler;
返回0;
}
size_t const initTable=FillMemeberHandleray();
#包括
#包括

由于这不使用容器的
操作符[]
来填充它,因此可以使用
std::array
而不是自己滚动近似值。

\include
#包括


由于这不使用容器的
操作符[]
来填充它,因此可以使用
std::array
而不是自己滚动近似值。

模板参数应该是常量表达式,
i
(来自
for
)不是常量表达式

你可以

constexpr array<void (Parser::*)(), 2> createArrayHandlers () {
     return {{&Parser::handler<0>, &Parser::handler<1>}};
}
constepr数组createArrayHandler(){
返回{{&Parser::handler,&Parser::handler}};
}

或者使用
std::index_sequence
来处理多个编译时值。

模板参数应该是常量表达式,
i
(来自
for
)不是常量表达式

你可以

constexpr array<void (Parser::*)(), 2> createArrayHandlers () {
     return {{&Parser::handler<0>, &Parser::handler<1>}};
}
constepr数组createArrayHandler(){
返回{{&Parser::handler,&Parser::handler}};
}

或者使用
std::index_sequence
来处理多个编译时值。

模板参数应该是常量表达式,
i
(来自
for
)不是常量表达式。您可以使用
std::index_sequence
初始化数组。模板参数应该是常量表达式,
i
(from
for
)不是常量表达式。您可以使用
std::index_序列
初始化数组。