gpt4 book ai didi

C++ 在类型列表中创建模板特化

转载 作者:太空狗 更新时间:2023-10-29 21:45:19 28 4
gpt4 key购买 nike

我有以下结构:

template<typename tag_type>
struct tag{
typedef tag_type type;
enum { value = -1 }
};

我使用这个类作为 typeid 来在运行时识别特定的类。这些类中的每一个都需要在类型列表中列出,并且每个标签特化都需要具有不同的值。

有没有办法让 value 等于列表中特化的索引。

我的目标是尽可能简单地维护具有唯一值的专用 tag 列表...(我需要确保列表中的每种类型都有唯一的值或部分系统会崩溃)

编辑:我没有提到我在编译时使用这些值...

最佳答案

我认为你的意思的非 C++11 实现,尽管你没有真正指定类型列表的结构。

template <typename H, typename T>
struct typelist {
typedef H head;
typedef T tail;
};

template <typename T, typename List, int N>
struct typelist_index_i
{
typedef typename List::tail tail;
enum {
value = N + typelist_index_i<T, tail, N + 1>::value
};
};

template <typename List, int N>
struct typelist_index_i<typename List::tail, List, N>
{
enum {
value = N + 1
};
};
template <typename List, int N>
struct typelist_index_i<typename List::head, List, N>
{
enum {
value = N
};
};

template <typename T, typename List>
struct typelist_index
{
enum {
value = typelist_index_i<T, List, 0>::value
};
};

class A {};
class B {};
class C {};

typedef typelist<A, typelist<B, C> > the_types;

template<typename tag_type>
struct tag{
typedef tag_type type;
enum { value = typelist_index<tag_type, the_types>::value };
};

int main()
{
std::cout << tag<A>::value << std::endl; // 0
std::cout << tag<B>::value << std::endl; // 1
std::cout << tag<C>::value << std::endl; // 2

system("pause");
return 0;
}

关于C++ 在类型列表中创建模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17859079/

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