【问题标题】:Is there a way to sequentialize type IDs at compile-time? [duplicate]有没有办法在编译时对类型 ID 进行排序? [复制]
【发布时间】:2021-11-07 04:06:43
【问题描述】:

我正在尝试执行以下操作:

template <typename type>
struct GetUniqueTypeValue
{
    constexpr static void* get()
    {
        return (void*)&GetUniqueTypeValue::get;
    }

};


constinit static void* record_array[16]{};

constexpr void * sequentialise(void* type_value)
{
    
    
    return nullptr; // I want to return a seuqntialised number here.
}



int main()
{
    constexpr void* type_value = GetUniqueTypeValue<int>::get();
}

我知道typeid()type_index 的值不是编译时值,所以这就是我使用函数指针方法的原因,它应该保证是唯一的,对吧?但是,我被困在这部分。我想要的基本上是一个用于类型 ID 的顺序计数器,这种方式通常在运行时使用某些技巧完成,例如每次调用 getID() 函数时或在启动时初始化 static 对象时递增一个计数器。除了我希望它是编译时。

我该怎么做? 编辑:我的意思是没有将每种类型都输入到函数中。我的意思是喜欢这个技巧:

struct SequentialiseTypes
{
     static inline int counter = 0;

     template <typename T>
     int getID() { return counter++; }
}

或其他方式:

int counter = 0;
template <typename T>
int ID = counter++;

编译时除外

【问题讨论】:

  • 您是否需要每个 ID 都是唯一的:(1) TU,(2) 单个可执行文件/共享库,或 (3) 可执行文件加上所有共享库?在编译时只有 (1) 是可能的。
  • @HolyBlackCat 每个类类型,所以 template struct OuterClass { template int get_sequentialised_unique_id( ) { } };
  • 这不是我要问的。假设您有两个 TU,每个 TU 打印一个 ID(不同类型)。您同意他们获得相同的 ID(即0)吗?因为没有办法防止 TU 之间的连续 ID 冲突。
  • @HolyBlackCat 如果您在标题中定义了一个 constexpr 函数来执行此操作并将其粘贴到多个翻译单元中,那么您是说在传递唯一数字时无法获得相同的结果,或者函数 ptr 到 constexpr 函数,对于传入的每个 ptr 值或数字得到相同的结果?
  • 我不明白你评论的后半部分,但是是的,当然不可能在 TU 之间交流 ID,所以不同的 TU 会看到不同的 ID。如果这不是您想要的,您将不得不接受非顺序 ID,例如类型名称的哈希(可以在编译时计算)。

标签: c++ constexpr


【解决方案1】:

不,如果不使用自定义实现,语言根本不支持!

如果运行时而不是编译时,并且可以接受学习新框架,则尝试Qt(而不是自定义实现)。

但即使在Qt 应用程序中;只有手动注册的类型才会由moc 处理,并且可以作为 ID 整数(或名称字符串)列出。

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 2013-02-22
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多