2010-04-07 52 views
3

也许我是过于复杂的事情,但是再次,我有点像干净的接口。比方说,我想要一个fstream的auto_ptr专业化 - 我想要一个默认的fstream用于一般情况,但允许替换指针?auto_ptr的模板特化<T>

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提供对象的默认实例。我可能不想提供一个专门的实例,但想保留这个静态默认对象的auto_ptr语义。

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

我可能不会在施工时提供一个动态对象 - 我仍然希望它有一个有意义的默认值。由于我没有考虑所有权转移语义,所以我的指针类指向一个静态分配的对象并不重要,不是吗?

+7

您似乎在混淆两个概念 - 自动指针和默认流的概念。这对我来说没有多大意义。 – 2010-04-07 13:33:00

+0

+1给尼尔。专门用auto_ptr这种方式会彻底改变它的语义:如何使用auto_ptr 的人知道默认值不是NULL? – 2010-04-07 13:36:53

+3

另外问题在于......因为在专业化时你必须完全重新实现它,为什么不给它另一个名字? – 2010-04-07 13:55:00

回答

2

这不会结束。最大的问题是std :: auto_ptr会在其析构函数中删除底层对象。这意味着你的默认参数不能是静态的。你可以做的唯一选择是在那里做大量的黑客行为,恕我直言,你付出的代价,同时保持所有糟糕的代码不值得你拥有的小优势。

+0

我可能会typedef它,而auto_ptr是一个基础选择,boost :: scoped_ptr可能会更好的基础。 – 2010-04-18 19:32:20

1

这对我来说看起来很合理,如果它的使用广泛存在于代码库中,并且没有记录,可能会引起混淆。

我注意到你正在car,,但我要强调它:确保你不会双释放你的静态对象!

+0

另一种方法是创建一个auto_ptr并指定一个默认值,然后在稍后重置它的值,或者在构造函数中执行它。我知道我宁愿让它做什么。 – 2010-04-18 19:34:55

1

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

Boost定义了构建auto_ptr的某些功能。如果你以某种方式重新定义,你违反了他们的规范。

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

编辑:auto_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 

我有点怀疑这样做的成本收益权衡的,但它是好于完全重新实现auto_ptr

如果违约对象被销毁,你仍然必须弄清楚该怎么做。上面的default_file将是deleted,可能是很多次。

+0

除了它不是一个真正的工厂。成语是我有一个指针,它希望它有一个已知的默认值。它可以随时更改。我想我可以小心地简单地分配一个默认值,但这是我宁愿在构造函数中完成的。 – 2010-04-18 19:34:06