2010-10-21 152 views
0

是否有可能有模板化類,還可以使用某種其他類型對構造函數進行模板化?使用模板化構造函數(其他類型)的模板類

是這樣的:

template<typename T1> 
class Foo{ 
    template<typename T2> 
    Foo(T1 aBar, T2 dummyArgument){ 
     bar = aBar; 
     bytesOfT2 = sizeof(T2); 
    }; 

    int bytesOfT2; 
    T1 bar; 
}; 

這可能嗎?如果是的話,我會如何調用這樣的構造函數?我是否需要考慮有關標題和cpp文件的內容?

謝謝!

//編輯:我的特殊示例實際上甚至更復雜一點。我有

template <typename U1, U2> 
class Foo{ 
    U1 var1; 
    U2 var2; 
}; 

template <typename T1> 
class Bar{ 
    template<typename T2, typename T3> 
    Bar(Foo<T2,T3> aFoo, T1 aVal){ 
     val=aVal; 
     bytesOfT2=sizeof(T2); 
     bytesOfT3=sizeOf(T3); 
    }; 

int bytesOfT2; 
int bytesOfT3; 
T1 val; 
}; 

是否意味着我可以在這裏調用構造函數只是Foo類型的任何變量,它會自動選擇合適的構造acording到富的特定版本(例如,如果我傳遞變量是請鍵入Foo,它應該自動將T2設置爲布爾型,T3將自動設置爲浮點型)?

+0

你說的意思是「我需要考慮的頭部和cpp文件的方面的東西嗎?」 – 2010-10-21 00:10:11

+0

mmmh - 由於某些原因(我不記得),有時我不得不放置一行,如「模板類Foo ;」到cpp文件中,如果我想要能夠使用具有模板類型bool的Foo類。 (所以我需要爲模板類使用的每種類型都做到這一點) – Mat 2010-10-21 00:12:45

+0

啊。您可以閱讀[C++ FAQ Lite](http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12)中的原因(該條目和以下條目討論「問題」以及如何解決問題;實際上,通常最好在頭文件中實現整個模板)。 – 2010-10-21 00:17:46

回答

8

是的,類模板可以有一個構造函數模板。你怎麼稱呼它,你會調用任何其它構造:

Foo<int> my_foo(42, 0.0); 

此調用與T1 = int構造函數模板(因爲T1是一個類模板參數和類模板參數是int)和T2 = double(因爲T2是一個函數模板參數並且從參數0.0推導出)。

所有模板參數都必須能夠從函數參數中推導出來,否則無法調用構造函數模板。沒有辦法顯式指定構造函數模板的模板參數。

+0

啊!所以我實際上可以傳遞一個任意變量作爲第二個參數,編譯器會自動爲我生成適當的構造函數版本?我甚至不必提及<>括號內的類型? – Mat 2010-10-21 00:09:48

+0

@Mat:是的。正如其他函數模板一樣,構造函數模板的參數推導也會發生。 – 2010-10-21 00:11:04

+0

如果我提供了一個類型化的變量Foo作爲參數,那麼我的擴展示例(參見上文)會如何選擇合適的「子類型」? – Mat 2010-10-21 00:19:40

0

你也可以使用一個以上的template type

template<typename T1, typename T2> 
class Foo{ 
public: 
    Foo(T1 aBar, T2 dummyArgument){ 
     bar = aBar; 
     bytesOfT2 = sizeof(T2); 
    } 

private: 
    int bytesOfT2; 
    T1 bar; 
}; 
+0

我不想要這個,我只想要構造函數是另一個變量類型 – Mat 2010-10-21 00:18:48

+0

@Mat:我在回覆時沒有得到。 :( – Donotalo 2010-10-21 01:54:44

1

是的,這是可能的。至於調用構造函數,您只需提供一個類型爲T1的參數和類型爲T2的第二個參數。就是這樣(除非有人進入關於「呼叫」的術語討論)。

順便說一句,而不是第一個默認初始化bar,然後分配給它,你應該初始化它直接,就像

template< class T2 > 
Foo(T1 const& aBar, T2 const& dummyArgument) 
    : bar(aBar) 
    , bytesOfT2(sizeof(T2)) 
{} 

查找在你的C++教科書構造函數和初始化。

乾杯&心連心,

+0

啊 - 我不知道我可以在初始化列表中使用表達式 - 謝謝! – Mat 2010-10-21 00:21:41

相關問題