C++ 非编译时常数

C++ 非编译时常数,c++,template-meta-programming,C++,Template Meta Programming,我有: static const std::数组数据大小= {std::make_pair(ServerD::ContentType,1) ,std::make_pair(服务器d::远程地址,2) ,std::make_pair(ServerD::RemoteUser,3) ,std::make_pair(ServerD::Url,4) }; 模板 结构SizeFinder{ 静态常量unsigned int SizeFor(服务器数据){ return(datasize[Index]。fir

我有:

static const std::数组数据大小=
{std::make_pair(ServerD::ContentType,1)
,std::make_pair(服务器d::远程地址,2)
,std::make_pair(ServerD::RemoteUser,3)
,std::make_pair(ServerD::Url,4)
};
模板
结构SizeFinder{
静态常量unsigned int SizeFor(服务器数据){
return(datasize[Index]。first==data)?datasize[Index]。second:
SizeFinder::SizeFor(数据);
}
};
模板
结构SizeFinder{
静态常量unsigned int SizeFor(服务器数据){
返回(数据大小[0]。第一个==数据)?数据大小[0]。第二个:
0;
}
};
为什么这不是编译时常量:

    static const std::array<std::pair<ServerD, unsigned int>, 4> dataSizes =
{ std::make_pair(ServerD::ContentType, 1)
, std::make_pair(ServerD::RemoteAddress, 2)
, std::make_pair(ServerD::RemoteUser, 3)
, std::make_pair(ServerD::Url, 4)
};

template <unsigned int Index>
struct SizeFinder {
    static const unsigned int SizeFor(ServerD data) {
        return (dataSizes[Index].first == data) ? dataSizes[Index].second :
            SizeFinder<Index - 1>::SizeFor(data);
    }
};

template <>
struct SizeFinder<0> {
    static const unsigned int SizeFor(ServerD data) {
        return (dataSizes[0].first == data) ? dataSizes[0].second :
            0;
    }
};
char tst[SizeFinder::SizeFor(serverD)]
//错误1错误C2975:'BufferSize':isapi:'anonymous namespace':'GetVariableFor'的模板参数无效,应为编译时常量

我必须在没有constexpr的情况下完成这项工作。VS2013仍然没有这个功能


<>强>编辑< /强>,因为静态const函数似乎不能在编译时计算,C++有03个解决方案吗?p> 您似乎只需要从
ServerD
unsigned int
的编译时映射。为什么不将其嵌入枚举值中:

char tst[SizeFinder<4>::SizeFor(serverD)]

似乎您只需要从
ServerD
unsigned int
的编译时映射。为什么不将其嵌入枚举值中:

char tst[SizeFinder<4>::SizeFor(serverD)]


它必须是一个静态常量变量而不是一个函数,如果不能使用c++11标记它有什么意义constexpr@aaronman修正了。我需要一些方法来传输ServerD。
数据大小
具有在运行时初始化的内存,您无法在编译时访问它@aaronman我不认为
constexpr
会有帮助。解决方法是不使用自动array@uk4321那么使用什么呢?它必须是一个静态常量变量,而不是一个函数,如果不能使用c++11,那么标记它又有什么意义呢constexpr@aaronman修正了。我需要一些方法来传输ServerD。
数据大小
具有在运行时初始化的内存,您无法在编译时访问它@aaronman我不认为
constexpr
会有帮助。解决方法是不使用自动array@uk4321那用什么呢?哇。这一切都是以一种奇怪的方式开始的。但你的答案非常准确。尽管这并没有真正将任何东西映射到任何东西(除了名称到值),但你仍然感兴趣的是,如果所呈现的内容是可行的。如果他需要用于其他内容的
ServerD
值,那么这将不起作用。@uk4321是的,它只执行OP想要的操作:将枚举数映射到无符号整数。哇。这一切都是以一种奇怪的方式开始的。但你的答案非常准确。尽管这并没有真正将任何东西映射到任何东西(除了名称到值),但你仍然感兴趣的是,如果所呈现的内容是可行的。如果他需要用于其他内容的
ServerD
值,那么这将不起作用。@uk4321是的,它只执行OP想要的操作:将枚举数映射到无符号整数。