2011-11-01 69 views
3

我希望能夠基於常量c風格的字符串專門化。問題是當我調用我的模板化函數時,類型是const char [N],其中'N'是字符串+1(空字符)的大小。我怎樣才能專注於所有的C風格的字符串?const char數組(c風格字符串)模板專門化

以下代碼顯示了該問題。你可以看到const char [15]與const char [15]匹配的特殊性,但是對於「const char [5]」,它會轉到Generic。

有沒有辦法做到這一點?當在Windows 7上運行

template <typename T> 
struct Test { 
    static const char* type() { return "Generic"; } 
}; 

template <> 
struct Test<const char*> { 
    static const char* type() { return "const char*"; } 
}; 

template <> 
struct Test<const char[]> { 
    static const char* type() { return "const char[]"; } 
}; 

template <> 
struct Test<const char[15]> { 
    static const char* type() { return "const char[15]"; } 
}; 

template <> 
struct Test<char*> { 
    static const char* type() { return "char*"; } 
}; 

template <> 
struct Test<char[]> { 
    static const char* type() { return "char[]"; } 
}; 

template <typename T> 
void PrintType(const T& expected) { 
    std::cerr << expected << " type " << Test<T>::type() << std::endl; 
} 
int main(int argc, char* argv[]) { 
    const char* tmp = "const char*"; 
    PrintType(tmp); 
    PrintType("const char[]"); 
    PrintType("const char[15]"); 
    PrintType("const char[5]"); 
} 

輸出 - VS 2008

const char* type const char* 
const char[] type Generic 
const char[15] type const char[15] 
const char[5] type Generic 

回答

12

一種用於char小號任何陣列專業化是:

template< std::size_t N > 
struct Test< const char[N] > { ... }; 

但是你不能再一char*type()返回,除非您編寫更多元函數來將非類型模板參數轉換爲其文本表示形式。

+0

謝謝,這個作品很棒。 – Michael

+0

從type()返回的char *僅用於調試目的。我也可以輸出1,2,3,4 ...。這是我的問題的一個例子。謝謝。 – Michael