当前位置:  开发笔记 > 编程语言 > 正文

嵌套模板专业化

如何解决《嵌套模板专业化》经验,为你挑选了2个好方法。

有一个大脑放屁......是否有可能做出像这样的工作?

template struct Foo
{
    template struct Bar;
};

template struct Foo::Bar<1> //Trying to specialize Bar
{
};

我不具备这样做的,但它可以让我很好地隐藏命名空间范围的一些实施细节.

建议赞赏!

PS:我忘了提到语言不支持明确专门针对Foo范围内的Bar.无论如何,AFAICS.



1> 小智..:

是的你可以.但是你需要改变调用结构,但只需要一点点.

具体来说,使用策略模式将成员函数的实现重组为一个类(允许IS专用).

只要策略类没有嵌套(因此不依赖于非专用模板类型),就允许这样做.

例如(这可能在语法上不正确,但想法应该清楚)

template 
class OuterThingThatIsNotSpecialized
{
  template 
  void memberWeWantToSpecialize(const U& someObj_)
  {
    SpecializedStrategy::doStuff(someObj_);
  }
};

template 
struct SpecializedStrategy;

template <>
SpecializedStrategy
{
  void doStuff(const int&)
  {
    // int impl
  } 
};

template <>
SpecializedStrategy
{
  void doStuff(const SomeOtherType&)
  {
    // SOT impl
  } 
};

这非常有用,因为对没有实现的类型调用OuterThingThatIsNotSpecialized将无法编译.

PS.您甚至可以使用此策略来部分地专门化模板函数,这是C++不可能实现的.



2> Hossein..:

Clause 18, Section 14.7.3 of the 1998 standard (ISO14882:1998) says explicit specialisation of (the inner) template member classes is not allowed when the (outer) template class is not explicitly specialised.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有