2010-04-07 50 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