使用 VS2015 的 Constexpr 查找 table
Constexpr lookup table with VS2015
我在四处寻找如何进行查找 table 并找到了 this 简单而优雅的答案。
我不想破坏线程,所以我想我会提出一个新问题。尝试在 VS2015 中编译该答案时出现以下错误:
template<int N>
struct Table
{
constexpr Table() : values()
{
// C3538 auto must always deduce the same type
// C3250 i declaration is not allowed in constexpr body
// C3249 illegal statement for sub-expression 'constexpr' function
for (auto i = 0; i < N; ++i)
{
values[i][0] = i;
values[i][1] = i * i * i;
}
}
int values[N][2];
};
int main(){
// defctor does not produce a constant value
constexpr auto a = Table<1000>();
return 0;
}
我尝试用 std::array
替换 C 样式数组,因为我认为这可能有助于迭代过程。我还检查了一些在线编译器上的代码,它可以在那里工作,但不能在 VS 中工作。
有什么问题,如何在不使代码模板膨胀的情况下复制解决方案?
如以上评论所述,MSVC 2015 不支持 C++14 constexpr
,但它支持许多其他 C++14 功能,因此您可以这样做:
#include <cstddef>
#include <utility>
template<int N> struct Table
{
constexpr Table() : Table(std::make_index_sequence<N>{}) { }
int values[N][2];
private:
template<std::size_t... Is> constexpr Table(std::index_sequence<Is...>)
: values{{Is, Is * Is * Is}...} { }
};
int main()
{
constexpr auto a = Table<100>{};
static_assert(a.values[77][0] == 77 && a.values[77][1] == 77 * 77 * 77, "oops");
}
IntelliSense 仍然抱怨 a
的初始化,但这是一个错误。 MSVC 接受代码(C++14 模式下的 Clang 和 GCC 也是如此)。
请注意,在原始代码中使用较大的 N
(Table<1000>
) 值会产生警告:
warning C4503: 'Table<1000>::Table': decorated name length exceeded, name was truncated
据我所知 the docs,在此上下文中可以安全地忽略警告。
我在四处寻找如何进行查找 table 并找到了 this 简单而优雅的答案。
我不想破坏线程,所以我想我会提出一个新问题。尝试在 VS2015 中编译该答案时出现以下错误:
template<int N>
struct Table
{
constexpr Table() : values()
{
// C3538 auto must always deduce the same type
// C3250 i declaration is not allowed in constexpr body
// C3249 illegal statement for sub-expression 'constexpr' function
for (auto i = 0; i < N; ++i)
{
values[i][0] = i;
values[i][1] = i * i * i;
}
}
int values[N][2];
};
int main(){
// defctor does not produce a constant value
constexpr auto a = Table<1000>();
return 0;
}
我尝试用 std::array
替换 C 样式数组,因为我认为这可能有助于迭代过程。我还检查了一些在线编译器上的代码,它可以在那里工作,但不能在 VS 中工作。
有什么问题,如何在不使代码模板膨胀的情况下复制解决方案?
如以上评论所述,MSVC 2015 不支持 C++14 constexpr
,但它支持许多其他 C++14 功能,因此您可以这样做:
#include <cstddef>
#include <utility>
template<int N> struct Table
{
constexpr Table() : Table(std::make_index_sequence<N>{}) { }
int values[N][2];
private:
template<std::size_t... Is> constexpr Table(std::index_sequence<Is...>)
: values{{Is, Is * Is * Is}...} { }
};
int main()
{
constexpr auto a = Table<100>{};
static_assert(a.values[77][0] == 77 && a.values[77][1] == 77 * 77 * 77, "oops");
}
IntelliSense 仍然抱怨 a
的初始化,但这是一个错误。 MSVC 接受代码(C++14 模式下的 Clang 和 GCC 也是如此)。
请注意,在原始代码中使用较大的 N
(Table<1000>
) 值会产生警告:
warning C4503: 'Table<1000>::Table': decorated name length exceeded, name was truncated
据我所知 the docs,在此上下文中可以安全地忽略警告。