簡體   English   中英

要求功能模板的返回類型是模板的專用化

[英]Require return type of function template to be specialization of a template

我在stackoverflow上閑逛了一段時間,但要么我對模板的了解不足以找到解決方案,要么以前根本沒有回答過。

在此示例中:

template <typename T> T f();

是否有可能使該函數要求類型T是std::basic_string模板的特殊化?

我可以將模板定義為T作為std::basic_string的類型(當然,內部使用std::basic_string<T> ):

template <typename T> std::basic_string<T> f();

但是然后我將無法將std::stringstd::wstring傳遞給函數(期望返回類型分別為std::stringstd::wstring ),這才是真正的目標(成為能夠傳遞從std::basic_string模板派生的任何類型)。

部分專業化允許您測試類型是否是特定模板的專業化。 SFINAE是一種可以“關閉”功能模板聲明的技巧。 該解決方案結合了這些技術。

template< typename T > // by default,
struct enable_if_basic_string {}; // a type is not a basic_string

template< typename CharT, typename Traits >
struct enable_if_basic_string< basic_string< CharT, Traits > > {
    typedef basic_string< CharT, Traits > type; // same as argument type
};

// enable_if_basic_string<>::type exists only if T specializes basic_string
// if not, compiler ignores function declaration per SFINAE.
template< typename T >
typename enable_if_basic_string< T >::type
F() {
    .....
}

如果您指的是推導和專業化,則可以看看std::tr1::is_convertibleenable_if

除了不要求Tstd::basic_string ,為什么不僅僅假定 Tstd::basic_string化,並讓模板實例化失敗(如果不是)。 只需使用您需要的std::basic_string中的內容即可。

例如,

template <typename T>
T get_first_three_chars(const T& str) { return str.substr(0, 3); }

在這里,我們假設T具有成員函數substr 如果不是,則實例化將失敗,從而導致編譯錯誤。

在香草C ++中這是不可能的。 提出了一種針對C ++ 0x的語言構造,可以允許這樣做,但不幸的是它被刪除了。

您可以使用Boost Concept Check Library在一定程度上做到這一點,但是: http : //www.boost.org/doc/libs/1_44_0/libs/concept_check/concept_check.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM