不编译时间常数

时间:2013-11-12 21:19:05

标签: c++ template-meta-programming

我有:

    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是否有解决方法?

1 个答案:

答案 0 :(得分:1)

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

enum class ServerD : unsigned int {
    ContentType = 1U,
    RemoteAddress = 2U,
    RemoteUser = 3U,
    Url = 4U
};

char tst[ServerD::Url];