static-assert 相关问题

在编译时验证的断言语句。 C ++ 11 / C ++ 14的一个特性,自4.3以来由gcc支持

旧版 G++ 的常量表达式的表达式编译时检查

我有以下宏用于某些编译时检查: /* 表达式内编译时检查计算结果为 0 */ #ifdef __cplusplus 模板 结构 Chk_sa; 模板 <> 结构 Ch...

回答 1 投票 0

如何在C++中打印编译时计算的结果?

我编写了几个 constexpr 函数并在 static_asserts 中使用它们来控制一些资源限制。但我不仅想强制执行编译时谓词,还想查看实际值计算...

回答 6 投票 0

constexpr:为什么我的表达式不是常量表达式?

我想在编译时定义一些缓冲区并使用 static_assert 检查它们的大小: 结构缓冲区{ int* 数组; size_t 尺寸; }; 模板 结构体ConstAr...

回答 1 投票 0

static_assert - 一种动态自定义错误消息的方法

有没有办法让static_assert的字符串动态定制然后显示? 我的意思是这样的: //伪代码 static_assert(Check_Range::value, "值" +

回答 4 投票 0

cpp中函数族的最佳实践实现

初步 函数族是函数 y=f_i(x) 的可数列表,对于某个整数 n 的计数器 i=0,...,n-1。 最小示例 我在 C++ 中有一个派生结构,它将定义这样一个函数...

回答 1 投票 0

如何静态断言 C++ lambda 的每个数据成员?

如何为任何给定 C++ lambda 的每个数据成员调用 static_assert? 我想做的是推出我自己的可 memcpy 的 std::function 并意识到任何 lambda 都必须具有微不足道的 co...

回答 1 投票 0

如何检查模板参数是否是2的幂?

我想创建一个静态分配 2^N 字节数组的结构,但我不希望该结构的用户指定这个大小作为指数。例子: 我的愚蠢数组 我想创建一个静态分配 2^N 字节数组的结构,但我不希望该结构的用户指定此大小作为指数。示例: my_stupid_array<char, 32> a1; // I want this! my_stupid_array<char, 5> a2; // And not this... 如何检查此模板参数是否为 2 的幂并通过一条不错的消息警告用户? 我已经能够使用一个简单的模板来检查这一点: template<int N> struct is_power_of_two { enum {val = (N >= 1) & !(N & (N - 1))}; }; 但是,我无法用理智的消息警告用户这一点。有什么想法吗? 编辑 修复了不明确的示例。 编辑 1确实是2的幂。解决了这个问题! :) 编辑 使用 BOOST_STATIC_ASSERT,我在使用 GCC 时收到此代码的编译错误: template<int N> struct is_power_of_two { enum {val = (N >= 1) & !(N & (N - 1))}; BOOST_STATIC_ASSERT(val); }; 错误 ..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' http://ideone.com/cMfEf 编辑 哦,我明白了。这是断言失败时我应该收到的消息。但这未能给用户一些理智的信息。 :( 这些天,有了 constexpr 和 一些小小的技巧,你就可以 constexpr bool is_powerof2(int v) { return v && ((v & (v - 1)) == 0); } static_assert 来救援(仅限 C++11,对于 C++03 取消注释 BOOST_STATIC_ASSERT): #include<iostream> // #include <boost/static_assert.hpp> template<int N> struct is_power_of_two { enum {val = N && !(N & (N - 1))}; static_assert(val, "should use a power of 2 as template parameter"); // BOOST_STATIC_ASSERT(val); // without C++11 support, won't take a string message }; int main() { std::cout << is_power_of_two<2>::val << "\n"; std::cout << is_power_of_two<3>::val << "\n"; } C++11 的 Ideone 输出 C++03 的 Ideone 输出 更新1:其他想法(我知道你不想要这个,但对于大指数来说要容易得多): template<int N> make_power_of_two { enum { val = 1 << N }; }; my_stupid_array<char, make_power_of_two<5>::val > a1; // size 2^5 = 32 更新2:根据@sehe在聊天中的评论,您也可以对constexpr功能执行此操作 constexpr bool is_power_of_two(int x) { return x && ((x & (x-1)) == 0); } 您可以使用 static_assert 提供错误消息: template<int N> struct is_power_of_two { static_assert((N > 1) & !(N & (N - 1)), "Template parameter must be a power of two."); }; 我知道这是一个老问题,但我想根据上面的答案(谢谢你顺便说一句!)提出我刚刚使用的另一个选项以及 c++20 概念: template<auto V> constexpr bool is_power_of_two = V && ((V & (V - 1)) == 0); template<class T, auto SIZE> requires is_power_of_two<SIZE> using my_stupid_array = std::array<T, SIZE>; my_stupid_array<char, 32> a1; // FINE my_stupid_array<char, 5> a1; // COMPILER ERROR

回答 4 投票 0

requires(std::driven_from<...>) 等价于 static_assert(std::is_base_of<...>) 吗?

我正在尝试学习需求表达式,作为熟悉概念机制的垫脚石。我能想到的最简单的方法就是通过替换我所有的

回答 1 投票 0

如何强制执行 C++ 命名要求“Container”

我正在尝试制作一个模板容器类,我希望它尽可能符合“Container”命名要求。我正在查看此 cppreference 链接,底部显示:

回答 1 投票 0

静态断言基类模板的继承

如何在下面的代码中实现编译器从混合器中的断言返回预期的编译错误消息(参见选项 B)? #包括 #包括 如何在下面的代码中实现编译器从混合器中的断言返回预期的编译错误消息(参见选项 B)? #include<iostream> #include<type_traits> template<typename _T> struct Base{ using T=_T; }; template<typename _T> struct Derived: Base<_T>{}; template<typename _T> struct Underived{}; template<typename Q, typename P> struct Tumbler{}; // CODE OPTION A template<typename TDerived> using Mixer = Tumbler<TDerived,typename TDerived::T>; // CODE OPTION B template<typename TDerived> struct Mixer: Tumbler<TDerived,typename TDerived::T>{ static_assert(std::is_convertible<TDerived*, Base<typename TDerived::T>*>::value, "TDerived must be derived of Base"); }; int main(){ Mixer< Derived<float>> mixer_intend; Mixer<Underived<float>> mixer_misuse; // spits error: "T undefined". I want error "is not derived of base" std::cout << "passed\n"; } 当前的问题是,如果不了解类型 T,就无法提出有意义的继承断言。选项 A 的解决方案优于选项 B 的解决方案。 应用上下文 用户可以为原始问题的派生而不是预处理问题调用 SolverFactory。上述问题的解决方案将允许我提示用户他/她/它忘记先预处理问题然后再通过它。现在,用户将调查他/她/它的问题,但徒劳地发现其中的错误。 当前的问题是,有意义的继承断言不能 在不了解 T 类型的情况下提出。 在 C++20 中,您可以将概念定义为 template<typename Derived> concept derived_from_base = requires (const Derived& d) { []<typename T>(const Base<T>&){}(d); }; 这要求可以将类型为Derived的对象传递给仅接受专门的Base类的参数的lambda,该lambda可用于确定类型Derived是否是公共的并且明确地继承自模板类Base。 然后您可以将使用类型别名限制为 template<derived_from_base TDerived> using Mixer = Tumbler<TDerived, typename TDerived::T>; 演示

回答 1 投票 0

为什么 static_assert 会破坏替换?

请考虑以下 C++14 代码: #包括 模板 类酒吧{ static_assert(std::is_destructible::value, "T 必须是可破坏的&...

回答 2 投票 0

用户定义的文字字符串:编译时长度检查

我有一个用户定义的文字运算符,仅对特定长度的字符串有意义,如下所示: constexpr uint16_t 运算符 "" _int(const char* s, std::size_t len) { 返回 len == 2 ...

回答 5 投票 0

调用 static_assert(false) 的正确方法是什么?

我正在尝试使用 static_assert 强制某些东西失败。如果您尝试以特定方式实例化特定模板函数,我想生成一个编译器错误。我可以让它工作,但是......

回答 5 投票 0

在编译时,如何将检查结果转换为错误警告?(例如检查multimap中是否存在重复键所以发出警告)[关闭]

我正在编写一个 C++ 类,它拥有一个静态 multimap 和几个静态函数。程序编译时会执行数据保存功能。我想检查是否...

回答 0 投票 0

验证定长字符串数组在编译时是否排序

当试图验证固定长度字符串数组在编译时是否已排序时,使用 strncmp 会出现奇怪的行为。 如果验证函数引用了全局数组,所有值...

回答 1 投票 0

我可以基于 constexpr if 编译失败吗?

是否有解决方法来做这样的事情? 如果 constexpr (std::floating_point) {} else if constexpr (std::integral) {} ... else static_failure("需要扩展功能&...

回答 0 投票 0

为什么具有隐式定义的默认构造函数的嵌套类不满足 std::default_initializable? [重复]

在下面的代码中,只有 Bar3 失败了。这种静态断言失败背后的原因是什么? #包括 结构 Bar1 { Bar1() = 默认值;布尔值=假; }; static_assert(std::

回答 0 投票 0

GCC:_Static_assert“静态断言的非常量条件”

我有更大的 C 代码库,我想在其中集成一些 C++ 代码。 C++ 代码需要来自 C 代码库的一些声明。 编译器目前是 GCC 6.3.1,但我们也许可以更新 co...

回答 1 投票 0

static_assert 在使用 linux GNU 编译包含在 c 文件中时会导致编译错误

我有静态断言在编译时验证结构大小以避免填充问题, 并确保我所有的结构都与 4 对齐。 我的一些代码是 cpp 文件,一些是 ...

回答 1 投票 0

编译时检查以确保结构中的任何地方都没有填充

有没有办法编写一个编译时断言来检查某些类型是否有任何填充? 例如: 结构 This_Should_Succeed { 诠释; 诠释乙; 诠释 c; }; 结构 This_Should_...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.