-1

 详细的要求是制作这样一个头文件,其中包含这样一个类模板和一堆它的特化(部分或全部),也许它们的几个成员函数也被包括在内。然后,只要开发人员不修改头文件本身,那么她/他就没有机会在头文件中使她/他自己的类模板特化。

 这是一个示例:头文件“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;

属于“你的”来源。

4

1 回答 1

2

为什么会有这种偏执——如果程序员愿意,任何事情都可以被打破!?

因此,答案是:没有办法。

于 2013-11-06T19:39:31.667 回答