2016-04-25 66 views
0

(我似乎無法爲此範例找到名稱,但如果可以的話,您將獲得獎勵upvote!)此模板範例用於防止數組衰減到指針:使用返回數組模板參數

template <size_t N> 
void foo(const char (&bar) [N]); 

Live Example

我們都能夠使用Nfoo的身體得到規模過bar。鑑於const char array[] = "lorem ipsum",我們使用此呼叫foo(array)來將bar定義爲const char (&) [12],其有效地傳遞2個參數用於一個的價格。


我想用這個同樣的想法,但在返回,例如:

template <size_t N> 
const char (&) [N] foo(const char (&bar) [N]); 

,這樣我就可以通過此陣列,並有另一個引用它,比如:auto result = foo(bar)

我這裏的代碼產生錯誤:

unrecognizable template declaration/definition

這可能嗎?

編輯:

爲了澄清,我希望能夠有一個函數返回,這將導致相當於:

auto& result = bar; 

這樣result將是一個const char (&) [*],其中*是尺寸爲bar

+1

它被稱爲「通過參考」:-) –

+0

@KerrekSB嗯......我希望有些更奇特的東西,但我想它是:J –

回答

3

C++語法是美妙的:

template <std::size_t N> 
const char (&f(const char (&arr)[N]))[N] // take that, Lisp 
{ 
    return arr; 
} 

對於不太自虐:

template <std::size_t N> using CarrN = const char[N]; 

template <std::size_t N> 
CarrN<N> & f(CarrN<N> & arr) 
{ 
    return arr; 
} 

至於術語:我們通常說 「arr引用過去了」,但更挑剔用戶可能會說「作爲左值傳遞」(並且也是這樣返回的)。

+0

[Demo](http://ideone.com/ WFwQ3G)。 –

+0

這似乎並不適用於我:http://ideone.com/kremY0 –

+0

錯誤...對不起,當我修復它顯示我在說什麼。 'test'是一個const char *&'不是'const char(&)[12]'。它的尺寸輸出爲4. –