测试模板参数的签名性
Testing the signedness of a template parameter
我需要屏蔽一个值的一些前导位。如果这个值是无符号的,我可以断言(保证)没有设置任意数量的前导位,也就是说,这个值保证是有限的。
如果它是签名的,我需要屏蔽前导位(将值变成一些不可移植的位堆,是的,我知道:-))。如果值是无符号的,我想保存屏蔽操作。
所以我基本上有
template<typename T, some more template parameters>
class {
unsigned transform(T value) {
...
if (isSigned(T)) {
value &= mask;
}
...
}
}
有没有一种简单的方法可以编写isSigned(),它可以在编译时进行评估(使优化器能够删除未签名的死代码)?
当然,我可以添加另一个模板参数。。。
是。你必须使用部分专业化:
template <bool> struct impl { static void foo(); };
template <> struct impl<true> { static void foo(); };
template <typename T> struct Foo
{
void do_magic(T const &)
{
impl<std::is_signed<T>::value>();
// ...
}
};
您可以使用<type_traits>
中现成的is_signed
特性类,而不是滚动自己的特性类。
if (T(-1) < T(0))
但我会把它放在一个模板参数中,并将其用于专门化,而不是条件代码。基于模板参数的条件代码通常会导致虚假的编译器警告,例如"无法访问的代码"或"条件中的常量表达式"。
类似于:
template <typename T, bool is_signed>
inline void apply_mask_helper(T& value) { value &= mask; }
template <typename T>
inline void apply_mask_helper<T, false>(T&) { }
template <typename T>
inline void apply_mask(T& value) { apply_mask_helper<T, T(-1) < T(0)>(value); }
使用limits
标头中的numeric_limits
:
if(numeric_limits<T>::is_signed) { … }
正如Kerrek所说,我会选择部分专业化。否则,编译器可能会抱怨条件的值在编译时是已知的。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- 如何将参数传递给Google基准测试程序
- GoogleTest 中的参数化测试无法按预期工作
- 如何在 gtest 中参数化测试组?
- C++ Catch 是否有类似 NUnit 的测试用例的东西,具有多个参数/输入选项
- 按类型参数进行GTEST滤波器测试
- 如何每次使用不同的参数多次测试方法
- 如何测试模板参数 T 的 std::函数<T>是否可构造
- GTEST-不同类型的参数化测试
- 为模板类创建GTEST值参数化测试
- 使用 googletest 在类型参数化测试中标识使用的基类
- GTEST - 参数化测试限制,编译错误
- 使用谷歌模拟测试C++时无法推断模板参数
- C 单元测试框架具有类型和值参数化
- 谷歌测试参数化的高级使用
- 输出结果时如何将参数化测试合并为一个
- 分配参数用于测试目的