簡體   English   中英

專業化模板成員函數來處理std :: string和char []參數

[英]Specializing template member function to handle both std::string and char[] arguments

我有一個類的模板成員函數,用於將各種不同類型添加到列表中,並對特定類型進行特殊處理和包裝(所有內容最終都包裝在var對象中):

template<typename V> const var& addvar(const V& v);

template<> const var& addvar<std::string>(const std::string& v) {/*stuff*/}

但是,我像這樣傳遞字符串(很好,const char數組):

object.addvar("lol");

盡管我將所有內容都作為std :: strings處理,但這在模板參數類型推導中作為某種const char數組引用彈出。 因此,即使使用上面的std :: string特殊化,我也會得到關於沒有功能的錯誤。 我熟悉模板數組大小的縮減,因此我試圖使用該格式來創建一個可以處理這種情況的addvar,例如:

template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}

但是事情發生了關於非法引用數組的編譯器錯誤。 這是在VC ++ 2010中,如果有任何特定的怪異之處,但我感到我在這里弄亂了一些基本知識。

您不能部分專門化模板函數,因此它必須是重載(=與初始addvar模板函數不共享任何內容的模板):

template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/}
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
                                                     ^

const char后面刪除&后,您正試圖以這種方式專門化引用數組,這不是您想要的(並且這都是非法的)。

該函數將如下所示:

template <std::size_t N>
void foo(const char (&a)[N])

但是您的問題是您不能部分專門化功能。 但是,您可以做的是定義一個簡單的重載,這將是首選,並可以從編譯器中調用。

暫無
暫無

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

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