代码之家  ›  专栏  ›  技术社区  ›  Chris K

自动模板专业化

  •  3
  • Chris K  · 技术社区  · 14 年前

    也许我过于复杂化了,但我还是有点像干净的接口。假设我想要一个fstream的auto-ptr专门化——我想要一个通用案例的默认fstream,但是允许一个替换指针?

     template <> 
     class auto_ptr<fstream> {
         static fstream myfStream; 
         fstream* ptr; 
    
     public: 
         auto_ptr() { 
             // set ptr to &myfStream;
         }
         reset(fstream* newPtr) {
             // free old ptr if not the static one. 
             ptr = newPtr 
         };
      } 
    

    你会考虑一些不同的或更优雅的东西吗?那么,如何防止类似上面的内容在这个特定的编译单元之外传播呢?

    [实际模板是Boost::Scoped_ptr。]

    编辑:

    这是一个做作的例子。忽略fstream-它是关于为auto-ptr提供对象的默认实例。我可能不想提供一个专门的实例,但希望保留这个静态默认对象的自动指针语义。

    class UserClass { 
    public:
        auto_ptr<fstream> ptr; 
        UserClass() {  }
    } 
    

    我可能在构建时不提供动态对象——我仍然希望它有一个有意义的默认值。因为我不看所有权转移语义,所以我的指针类指向静态分配的对象真的不重要,不是吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   user283145    14 年前

    结果不会很好。最大的问题是std::auto_ptr删除其析构函数中的基础对象。这意味着默认参数不能是静态的。你唯一能做的选择就是在那里做大量的黑客攻击,并且我知道你在维护所有这些糟糕的代码的同时所付出的代价不值得你拥有这么小的优势。

        2
  •  1
  •   James    14 年前

    在我看来,这是合理的,如果它的使用在代码库中广泛使用,并且没有文档记录,那么可能会令人困惑。

    我注意到你很谨慎,但我还是要强调一点:确保你不会双倍释放你的静态物体!

        3
  •  1
  •   Potatoswatter R. Martinho Fernandes    14 年前

    你可能会得到一些编译和工作的东西,但如果我是你的话,我不会这样做的。

    Boost为构造 auto_ptr . 如果您以某种方式重新定义了它,那么您就违反了它们的规范。

    为新功能创建一个名称,使其成为工厂功能,并且不必担心专门化其他人的模板。

    编辑: 来源于 自动PTR 是另一个选项,如果您真的设置了更改初始化语义:

    tempate < class T, T *d > 
    struct defaulted_auto_ptr
        : public auto_ptr< T > {
        defaulted_auto_ptr( T *p = d ) throw() : auto_ptr<T>( p ) {} // set default
        defaulted_auto_ptr( auto_ptr<T> &r ) throw()
            : auto_ptr<T>( r ) {} // allow conversion
        template< class O > defaulted_auto_ptr( auto_ptr<O> &r ) throw()
            : auto_ptr<T>( r ) {}
    };
    
    fstream default_file;
    typedef defaulted_auto_ptr< fstream, &default_file > file_ptr;
    
    auto_ptr< fstream > baseptr = file_ptr(); // can assign to auto_ptr, but unsafe
    

    我对这种成本效益权衡有点怀疑,但总比重新实现要好。 自动PTR .

    如果一个默认的对象被破坏了,您仍然需要弄清楚该怎么做。 default_file 以上将 delete D,可能很多次。