gpt4 book ai didi

c++ - 将类型转换为唯一编号的模板元程序

转载 作者:可可西里 更新时间:2023-11-01 14:54:26 28 4
gpt4 key购买 nike

我刚开始玩元编程,我正在处理不同的任务只是为了探索这个领域。其中之一是生成一个唯一的整数并将其映射到类型,如下所示:

int myInt = TypeInt<AClass>::value;

其中值应该是一个编译时常量,它又可以在元程序中进一步使用。

我想知道这是否完全可行,在那种情况下如何实现。因为虽然我已经了解了很多关于探索这个主题的知识,但我仍然没有找到答案。

(附:是/否答案比不使用元编程的 C++ 解决方案更令人满意,因为这是我正在探索的领域)

最佳答案

原则上,这是可能的,尽管解决方案可能不是您正在寻找的。

简而言之,您需要提供从类型到整数值的显式映射,每种可能的类型都有一个条目:

template< typename T >
struct type2int
{
// enum { result = 0 }; // do this if you want a fallback value
};

template<> struct type2int<AClass> { enum { result = 1 }; };
template<> struct type2int<BClass> { enum { result = 2 }; };
template<> struct type2int<CClass> { enum { result = 3 }; };

const int i = type2int<T>::result;

如果您不在基本模板中提供回退实现,如果 T,这对于未知类型将失败,否则它将返回回退值。

根据您的情况,可能还有其他可能性。例如,您可以在类型本身内定义这些数字:

class AClass {
public:
enum { inta_val = 1 };
// ...
};

class BClass {
public:
enum { inta_val = 2 };
// ...
};

// ...

template< typename T >
struct type2int
{
enum { result = T::int_val }; // will fail for types without int_val
};

如果您提供更多上下文,可能还有其他解决方案。

编辑:

Actually there isn't any more context to it. I was looking into if it actually was possible, but without assigning the numbers itself.

我认为 Mike 的排序想法是一种很好的方法(同样,对于一组固定的类型),而不必显式分配数字:它们由排序隐式给出。但是,我认为使用类型列表会更容易。列表中任何类型的索引都是它的编号。我想像下面这样的事情可能会做:

// basic type list manipulation stuff
template< typename T1, typename T2, typename T3...>
struct type_list;

// meta function, List is assumed to be some instance of type_list
template< typename T, class List >
struct index_of {
enum { result = /* find index of T in List */ };
};

// the list of types you support
typedef type_list<AClass, BClass, CClass> the_type_list;

// your meta function
template< typename T >
struct type2int
{
enum { result = index_of<T, the_type_list>::result };
};

关于c++ - 将类型转换为唯一编号的模板元程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708458/

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