2011-11-29 42 views
-2

我有幾個小的類,它們都是在同一個文件中聲明和定義的所有對等的對等方。許多這些類共享信息。目前,共享信息的類型是硬編碼的,用於初始開發和測試目的,但我想模板化(動詞形式?)類。但是,如果我在每個類之前編寫template構造,則可能會導致用戶可能創建具有不同類型參數的每個類的實例,這很可能會導致數據或代碼中的錯誤。有沒有辦法強制使用相同類型創建所有類實例?在多個模板上執行相同的類型

我能想到這樣做的唯一方法是與成員的功能,如createInstanceOfA()createInstanceOfB()等,用戶必須先創建spawner類的實例與期望創建一個額外的initspawner類鍵入,然後使用其成員函數創建其他類的實例。當然,這意味着我的spawner類將不得不與我擁有的任何實用類保持同步(這應該不是問題)。但是,有沒有更好的方法來做到這一點?

編輯:舉個例子,我的「醜陋的解決方案」(一個簡單的例子):

template <typename T> 
struct A { 
    void manipulate(T arg); 
}; 

template <typename T> 
struct B { 
    void manipulate(T arg); 
}; 

template <typename T> 
struct C { 
    void manipulate(T arg); 
}; 

template <typename T> 
struct Spawner { 
    A<T> createInstanceOfA(void); 
    B<T> createInstanceOfB(void); 
    C<T> createInstanceOfC(void); 
}; 


int main() { 

    // don't allow 
    A<int> a; 
    B<float> b; 
    C<double> c; 

    // allow 
    Spawner<int> s; 
    A<int> s.createInstanceOfA(); // not sure if syntax is correct 
    B<int> s.createInstanceOfB(); 
    C<int> s.createInstanceOfC(); 

    return 0; 
} 
+2

爲什麼你想要模板,如果代碼不通用?這種設計聽起來很難看。 –

+0

如果這是一個錯誤,以臨時文件爲什麼模板它 – rerun

+0

@CatPlusPlus和重新運行:允許共享數據是任何類型,只要它是所有相同的類型。我同意我的「解決方案」聽起來很難看。我希望有人有一個更好的主意。 – LowTechGeek

回答

2

你要求的東西沒有意義。 foo<int>是與foo<float>不同的類型 - 您不應該遇到錯誤類型的問題。

看起來你想要的是要求3個類同時實例化同一個類。你想要的不是3個獨立的類,而是1個單獨的類(例如由幾個類構成一個)

template <typename T> 
struct col { 
    struct t1 { 
    T data; 
    } a; 
    struct t2 { 
    T data; 
    } b; 
}; 

col<int> foo; 
foo.a.data = 5; 
foo.b.data = 7; 

void process_stuff(col<int>::t1 a) { 
    // ... 
} 
process_stuff(foo.a); 
+0

聽起來更好;-) – oberfreak

+0

你的解決方案與我的(基本上)是一樣的,它帶來了兩個問題:1)我認爲沒有更好的方法來做到這一點(這是我的原始問題),2)因爲你,我和@manler(編輯後)幾乎都得出了相同的結論,我不明白爲什麼沒有人能夠理解我的問題。你能向我解釋一下我原來的帖子有什麼不清楚的地方,以便我今後不會犯同樣的錯誤?謝謝。 – LowTechGeek

1

什麼你想達到被稱爲概念通過它的技術名稱,並且有一個Boost庫,ConceptCheck,你可以用它來實現這個。

您也可以使用std::enable_if和SFINAE(替代失敗不是錯誤)。

但模板是爲了使代碼具有通用性,並且它聽起來並不像你想要的那樣。我會重新考慮你的設計。

1

您可以專門化模板。 所以,如果你這樣做:

template<typename T> class A; 

template<> 
class A<int> 
{...}; 

template<> 
class A<double> 
{...}; 

然後,如果你或其他人試圖創建一個

A<std::string> a; 

會有一個編譯錯誤,因爲該類型不專業。

但也許這不是你想要的?

編輯:

我有些誤解了這個問題。也許你可以通過控制類的創建來解決這個問題?像通過工廠一樣?如果您只允許通過工廠創建類,那麼您應該能夠在多個模板上執行相同的類型。也許這只是將問題推向了工廠類...

祝你好運!