我通常會聲明我的類和模板,然後在(在當前的頭文件中)定義它們的方法。我發現這樣更容易閱讀。那麼,我遇到了一個案例,我無法弄清楚一個工作類型簽名是否在一個不符合類的定義中使用。下面是我在做什麼一個簡單的例子,說明該問題:類型的enable_if'ed模板模板構造函數的簽名?
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
(Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
我已經嘗試了一些在WHAT_GOES_HERE
插槽的東西,試圖得到一個匹配的簽名,我一直失敗。我需要使用enable_if來區分兩個T類型對象傳入的情況,以及一個傳入一對Iterator時的情況。如果模板化的構造函數是在主模板內部定義的,那麼代碼就可以正常工作,而代碼目前是這樣做的,但我寧願將該定義移動到聲明之外。
編輯:我要指出,我不能只重複使用enable_if < ...>的定義,因爲enable_if < ...>指定其類型,你不能做一個缺省值一個定義也不是一個聲明。
你真的需要SFINAE這個?如果您只聲明第二個構造函數爲'template Foo(U first,U last);',如果調用者傳遞兩個類型爲T的對象,則仍然會選擇第一個構造函數。 –
2011-02-27 20:21:47
類型T通常是一種算術類型,我希望在T無符號時能夠傳入整數,反之亦然,並且沒有調用模板構造函數(在使用enable_if之前發生了這種情況) – swestrup 2011-02-27 20:29:13
實際上,你根本沒有分配一個默認值。你的模板的第二個參數是'enable_if''。有點像如果你期望一個'int'。它不應該編譯,當然也不可能使用。 –
2011-02-27 20:33:42