详细的要求是制作这样一个头文件,其中包含这样一个类模板和一堆它的特化(部分或全部),也许它们的几个成员函数也被包括在内。然后,只要开发人员不修改头文件本身,那么她/他就没有机会在头文件中使她/他自己的类模板特化。
这是一个示例:头文件“MyIncl.h”中的内容:
namespace n1
{
template < typename _Ty >
class MyTmplCls
{
typedef MyType1 OutputType;
};
template <>
class MyTmplCls< MyType4Spec >
{
typedef MyType2 OutputType;
};
}
然后有人可以在他自己的来源中做到这一点:
...
namespace n1
{
template <>
class MyTmplCls< YourType >
{
typedef YourSelfDefType1 OutputType;
};
}
...
这是我想防止的。
请注意,问题是如何制作此类模板(当然还有包含它的头文件),而不是“如何防止头文件被修改”或“如何防止类模板被其用户专门化”无需修改头文件本身'。简单地说,关键是头文件不是“未经修改”而是“被谁修改”,而后者的答案是“Header's maker”。
这些是我迄今为止尝试过的:头文件'MyIncl.h'中的内容:
struct n1
{
template < typename _Ty, DummyType >
class MyTmplCls
{
typedef MyType1 OutputType;
};
template < DummyType _dt >
class MyTmplCls< MyType4Spec, _dt >
{
typedef MyType2 OutputType;
};
};
我认为只要您的项目包含 MyIncl.h,就无法重新定义结构。但是有人仍然可以在他的来源中做到这一点:
...
template < DummyType _dt >
class n1::MyTmplCls< YourType, _dt >
{
typedef YourSelfDefType1 OutputType;
};
...
我找到了另一种方法:
template < DummyType >
struct n1
{
template < typename _Ty, DummyType >
class MyTmplCls
{
typedef MyType1 OutputType;
};
template < DummyType _dt >
class MyTmplCls< MyType4Spec, _dt >
{
typedef MyType2 OutputType;
};
};
尽管有人仍然可以执行以下操作,但它比以前的方式更受限制:
...
template <>
template < DummyType _dt >
class n1<0>::MyTmplCls< YourType, _dt >
{
typedef YourSelfDefType1 OutputType;
};
...
上面的代码部分只是试图告诉我打算做什么。它们不一定是正确的方法。好的...现在我需要真正正确的方法。任何有用的提示将不胜感激。
**如果你想自己测试,这里是上面代码需要的符号*
typedef int MyType4Spec;
typedef long MyType1;
typedef short MyType2;
typedef int DummyType;
属于头文件,并且
typedef void YourType;
typedef void YourSelfDefType1;
属于“你的”来源。