Templates 类型或模板参数的模板专门化

Templates 类型或模板参数的模板专门化,templates,c++11,template-specialization,Templates,C++11,Template Specialization,我有一个类,它枚举模板化类型的一个或多个类型类别的成员符号。我用宏来克服C++符号的缺点,用抽象的符号来表示一个类型的正交使用。因为我可以直接访问符号抽象,所以操作对象的性质基本上是不相关的 示例用法是: struct MyNonTemplatedStruct { int Num; float FloatNum; }; template< typename SomeType > struct MyTemplatedStruct { int Count; SomeType O

我有一个类,它枚举模板化类型的一个或多个类型类别的成员符号。我用宏来克服C++符号的缺点,用抽象的符号来表示一个类型的正交使用。因为我可以直接访问符号抽象,所以操作对象的性质基本上是不相关的

示例用法是:

struct MyNonTemplatedStruct
  { int Num; float FloatNum; };

template< typename SomeType >
struct MyTemplatedStruct
  { int Count; SomeType Object;  };


mDeclareRTTI_Type( MyNonTemplatedStruct, Num, FloatNum );

mDeclareRTTI_Type( MyTemplatedStruct, Count, Object );

MyRTTClass<MyNonTemplatedStruct> RTTI_N;

MyRTTClass<MyTemplatedStruct> RTTI_T;

cout << RTTI_N.IDName(0);              // "Num"
cout << RTTI_T.IDName(RTTI_T.Object);  // "Object"

typename RTTI_N::ThisType StackMyNonTemplatedStruct;

auto HeapMyTemplatedStruct = RTTI_T.New<float>();
struct MyNonTemplatedStruct
{int Num;float FloatNum;};
模板
结构MyTemplatedStruct
{int Count;SomeType对象;};
mDeclareRTTI_类型(MyNonTemplatedStruct,Num,FloatNum);
mDeclareRTTI_类型(MyTemplatedStruct、Count、Object);
桃金娘;
桃金娘;

我应该澄清一下,mDeclareRTTI_类型(classname,member1,…)是一个声明MyRTTClass专门化的宏。在内部,它使用宏为每个符号创建序列化、访问者界面、元组式表示和成员的索引映射。我认为包括它的细节会混淆我的问题,所以我把它们忽略了。你知道boost的fusion库提供的吗?他们似乎和你在同一个问题空间工作。。。即在编译时使类型适应一系列成员。看看这个库提供的接口可能会有帮助,它可以调整结构并在之后为您的结构建模。你也许能够避免你这样描述的无限回归。您可能知道,您可以从boost的网站免费下载源代码。这里有一个想法:您可以将所有非模板类型/值包装/调整到一个模板中,该模板包含有关类型/值的所有必要信息。这样,您就不需要同时容纳模板和非模板类型的模板。也就是说,您只需要
mDeclareRTTI\u Type\u Templated\u Version()
。希望我能理解你的问题,这不是胡说八道@dog jones谢谢,适配器确实对模板进行了处理,我正在检查。它看起来非常明确,需要用户手动重新创建模板签名,就像它需要用户为每个成员添加类型信息一样。我的方法解决了手动要求用户手动复制类型信息的问题。由于信息已经隐式显示,所以我尝试公开它的显式版本,以便可以使用相同的自动方法来创建模板签名。@dog jones。是的,我倾向于用一个特殊的NULL_模板把所有东西都当作一个模板,当它实际上不是一个模板时要传递参数。能够一视同仁地对待事物有很大的优势。我认为我甚至有一个宏技巧,可以检测是否传递了NULL_模板,并在宏求值过程中有条件地响应是否传递了NULL_模板。
template<...> //unrestricted by number, typename or non-type
MyRTTIClass {};

template< typename T>
template<> MyRTTIClass<T> {};

template< template<typename...> class Tmpl >
template<> MyRTTIClass<Tmpl> {};