gpt4 book ai didi

c++ - 强制评估 constexpr 静态成员

转载 作者:行者123 更新时间:2023-11-30 02:41:47 26 4
gpt4 key购买 nike

当我想使用一些 helper struct 和 constepxr 函数检查某些模板参数的有效性时,我遇到了问题。只要没有对我要初始化的静态 constexpr 成员的引用,编译器就决定不计算表达式。我使用的代码如下:

#include <cstddef>
#include <iostream>

#define CONSTEXPR static constexpr
using namespace std;

template<size_t ... Sizes>
struct _size_check_impl
{
static_assert(sizeof...(Sizes) != 0, "Dimension has to be at least 1");
CONSTEXPR size_t dimension = sizeof...(Sizes);
};

template<size_t ... Sizes>
constexpr size_t check_sizes()
{
return _size_check_impl<Sizes...>::dimension;
}

template<size_t ... Sizes>
struct Test
{
static constexpr size_t Final = check_sizes<Sizes...>();
};

int main()
{
Test<> a; // This shouldn't get through the static assert
Test<1, 2> b; // Passing
Test<2> c; // Passing
// cout << Test<>::Final; // With this it works just fine, bc Final is accessed
return 0;
}

有没有一种方法可以做到这一点,如果对 constexpr 进行评估,一些代理依赖会强制编译器评估 Final 值?是否有另一种干净的方法来干净快速地检查此属性?

最佳答案

简单的答案可能是简单地添加另一个 static_assert :

template<size_t ... Sizes>
struct Test
{
static constexpr size_t Final = check_sizes<Sizes...>();
static_assert(Final > 0, "");
};

不过,这将导致两个独立的静态断言失败。如果这对您来说是个问题,您可以确保 check_sizes , 或 Final , 用于其他一些必须在模板类实例化时评估的方式,没有任何成员的实例化,例如:

template<size_t ... Sizes>
struct Test
{
static constexpr decltype(check_sizes<Sizes...>(), size_t()) Final = check_sizes<Sizes...>();
};

还有一个选择:如果Test<...>是期望正常构造的类,你可以确保Final以某种方式从构造函数中使用。

关于c++ - 强制评估 constexpr 静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27694688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com