当前位置: 首页 > 知识库问答 >
问题:

通过编译时值推断整数的类型

罗奇文
2023-03-14

使用C 14、17或20,我将两个模板参数传递给模板化类:TSze和Max大小。

TSze是Max大小的类型。显然,两者在编译时都是已知的。TSze需要足够大以适应Max大小。

template <typename TSize = uint8_t, TSize MaxSize = 15>
class Foo {};

如何通过MaxSize的值自动推导出TSize,这样只要设置MaxSize的值就自动拥有了?即:

if MaxSize<256 -> TSize=uint8_t
if MaxSize<65536 && MaxSize>255 -> TSize=uint16_t

非常感谢你的帮助!

共有2个答案

印辉
2023-03-14

您可以使用< code>std::conditional根据compiletime条件在两种类型之间进行选择。如果你不想改变< code>Foo,你需要一些间接的方法来为< code>Foo选择正确的类型(也许部分专门化也可以):

#include<type_traits>

template <typename TSize = uint8_t, TSize MaxSize = 15>
class Foo {};

template <unsigned value>
using Size_t_impl = typename std::conditional<(value > 255),uint16_t,uint8_t>::type;

template <unsigned value>
using FooIndirect = Foo< Size_t_impl<value>,value>;
何乐
2023-03-14

你可以使用这样的东西:

template<uintmax_t n>
using FittingUIntT = std::conditional_t<
    n <= UINT8_MAX, uint8_t, std::conditional_t<
    n <= UINT16_MAX, uint16_t, std::conditional_t<
    n <= UINT32_MAX, uint32_t, uint64_t
>>>;

演示

 类似资料:
  • 前几天我问了一个关于嵌套向量的非常类似的问题,但我遇到了另一个让我难堪的问题。我需要在编译时获取嵌套向量的最内层类型,以便将其作为模板参数传递。 例如,如果我有这个嵌套向量: 我需要一种方法来提取,这样我就可以调用一个函数,它需要一个嵌套的向量,并对这样的元素工作: 除了catch之外,这个函数应该能够处理包含任何类型的任何深度的嵌套向量。当我调用时,我希望自动为我推导出内部类型。 所以也许电话看

  • 问题内容: 以下代码在t3行中出现编译错误: 错误消息是: 类型不匹配:无法从对象转换为T 我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败? 编辑:添加了错误消息。 编辑:添加了另一个示例如何不会发生该错误。 编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。 问题答案: 在第一种情况下,您有两个具有名为的类型参数的泛型方法,但是这些类

  • 问题内容: 我正在为核心数据编写通用包装类。 这是我的一些基本类型。没什么特别的。 我已经将我的coredata写在协议中抽象化了。如果您让我知道您对我要提出的抽象的意见,我将不胜感激。但是在扩展中,我遇到了以下错误: 无法将类型“ NSFetchRequest”的值转换为预期的参数类型“ NSFetchRequest <_>” 不确定我该如何解决。我尝试了各种更改代码的尝试,但未成功…… 另外,

  • 我的分类测试应用程序有一个问题,我使用了一个比较器。我收到一条信息: 线程“主”java.lang 中的异常:未解决的编译问题:无法推断排序器的类型参数 对于该代码: 分拣机类: 可比接口: id比较器类: 比较器接口: 这样用有什么错?我怎样才能做得更好?

  • 本节介绍IntegralConstant的重要概念和Hana的元编程范式背后的哲学。让我们从一个奇怪的问题开始。什么是integral_constant? template<class T, T v> struct integral_constant{ static constexpr T value = v; typedef T value_type; typedef i

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 问题内容: Java通常可以基于参数(甚至与返回类型(例如,与C#相反))来推断泛型。 恰当的例子:我有一个通用类,它只存储一对值,并且可以按以下方式使用: 该方法如下所示: 非常好。但是,这不再适用于以下需要通配符的用例: (请注意显式强制转换以进行正确的类型。) 代码失败,并显示以下错误(由Eclipse提供): 类型不匹配:无法从转换为 但是,显式调用构造函数仍然可以按预期工作: 有人可以解

  • 我仍然在玩我的日历,我已经设法将 https://github.com/SundeepK/CompactCalendarView 整合到我的一个片段中。只剩下一个错误,我做了一些研究,其他人也遇到了问题,例如使用ArrayList 示例代码: IDE说: 注:C:...\Uebersicht.java使用或覆盖不推荐使用的API。注意:用-Xlint:deprecation重新编译以获得详细信息。