【问题标题】:Not compile time constant不是编译时间常数
【发布时间】: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


【解决方案1】:

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

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

char tst[ServerD::Url];

【讨论】:

  • 哇。这一切都以一种奇怪的方式开始。不过你的回答很准确。
  • 仍然对所提出的方案是否可行感兴趣
  • 这并没有真正将任何东西映射到任何东西(名称到值除外)。如果他需要 ServerD 值来做其他事情,那么这将不起作用。
  • @uk4321 是的,它只做 OP 想要做的事情:将枚举数映射到无符号整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2011-01-19
  • 1970-01-01
相关资源
最近更新 更多