2013-08-26 48 views
1

甚至不知道這種情況的正確術語是什麼。如果我知道它,那麼我可能會找到答案。如何專門化任何類型的模板以允許可變長度的數組

我有一個模板化的功能,看起來像

template<typename T> void write(Buffer& b, const T& value); 

還有就是這個沒有通用的實現,只有明確的專業。例如。

template<> void write<int>(Buffer& b, const int& value) { ... } 
template<> void write<const char *>(Buffer& b, const char * const & value) { ... } 

到目前爲止好。但是,當然,當我打電話的write(buffer, "hello")我得到一個鏈接錯誤抱怨

undefined reference to `void write<char [6]>(Buffer&, char const (&) [6])' 

這個錯誤對我來說很有意義。但我無法弄清楚的是如何爲此宣佈專業化。我想要這樣一個專門做的就是將char[]參數投給(const char*)並調用現有的專業化。但我無法弄清楚如何做到這一點。

對於具體的例子我可以做

template<size_t N> void write<char[6]>(Buffer& b, char const (&value) [6]) 

,但它顯然不能接受的定義其中之一爲每個可能的長度字符串常量。但我已經嘗試了以下,其中一些只是抓住吸管,而沒有一個能夠工作。

template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 
template<size_t N> template<> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 
template<> template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 
template<template<size_t N>> void write<char const[N]>(Buffer& ob, char const (&value) [N]) 

什麼是正確的咒語?我正在使用GCC 4.7.3 x86_64。

回答

0

您不能對模板函數進行部分特化。請參閱this explanation以瞭解如何對模板類中的函數執行間接級別以避開此限制。

在這個簡單的例子,你也可以與調用模板一個非模板write獲得通過:

void write(Buffer &b), const char *v) 
{ 
    write<const char *>(b, v); 
} 

這有效地隱藏,將曾與內聯函數模板功能工作的演員。

+0

@SnoopyLane - 這是否回答這個問題? – sfjac

+0

對不起,很晚回覆。很多分心。事實上,這確實解釋了這個問題,而非模板版本就是我最終的結果。非模板是我最初想要的,但是我深深陷入了一些元編程中,並認爲我需要這些模板。我在頂部粘貼的片段已將其簡化。 – SnoopyLane

1

如果它是確定的,不與字符數組調用時write()功能(或使用在這些情況下char const*,而不是,例如,char[6]),來實現這一點的方法是使用過載指定的參數類型處理char const*

void write(Buffer& ob, char const* value) { 
    write<char const*>(ob, value); 
} 

此功能優先於模板實例,並且可以,因此,可以被用於適當地委派字符串文字的處理(或C-字符串一般,實際上)。

如果有必要得到正確的類型過去了,只有將工作的方式是不專業的實際功能模板,但相反,立即委派struct用合適的成員函數和部分專門這一struct到處理數組:你不能部分專門的函數模板,即,以下是非法的:

template <int N> 
void write<char const[N]>(Buffer& ob, char const (&value)[N]); // ERROR 

...但它可以通過部分專業一struct代替模擬。

+0

謝謝Deitmar。對不起,很晚回覆。那麼,「通過部分專門化結構來模擬」是什麼意思?有一個例子的鏈接? – SnoopyLane

+0

我的意思是將函數包裝成部分專用的'struct',即'template struct helper;模板 struct helper {static void write(Buffer&obj,char const(&value)[N]); };' –

相關問題