【发布时间】:2013-11-25 05:55:54
【问题描述】:
我有:
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<4>::SizeFor(serverD)]
// 错误 1 错误 C2975: 'BufferSize' : 'isapi::`anonymous-namespace'::GetVariableFor' 的模板参数无效,预期的编译时常量 表达式
我必须在没有 constexpr 的情况下完成这项工作。 VS2013还是没有这个。
编辑 静态 const 函数似乎无法在编译时计算,C++ 03 有解决方法吗?
【问题讨论】:
-
它必须是一个静态的 const var 而不是一个函数,如果你不能使用 constexpr,那么标记它的意义何在 c++11
-
@aaronman 修复了这个问题。我需要某种方式来传输 ServerD。
-
dataSizes具有在运行时初始化的内存,您无法在编译时访问它。 @aaronman 我认为constexpr不会有帮助。 -
解决方法是不使用自动数组
-
@uk4321 那用什么?
标签: c++ template-meta-programming