2016-04-25 16 views
0

(私はこのパラダイムの名前を見つけることはできませんが、できればボーナスupvoteを得ます!)このテンプレートパラダイムは、配列がポインタ:戻り値の配列テンプレートパラメータを使用

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

Live Example

我々はbarオフサイズを取得するためにfooの本体でNを使用することができます。 const char array[] = "lorem ipsum"が与えられた場合、foo(array)を呼び出してbarconst char (&) [12]と定義し、実際には1つの価格に対して2つのパラメータを渡します。


私はこれと同じ考え方を使用したいが、リターンで、例えば:

私のような、通過配列を渡すと、それを別の参照を持つことができるよう
template <size_t N> 
const char (&) [N] foo(const char (&bar) [N]); 

auto result = foo(bar)

これが可能である

unrecognizable template declaration/definition

:私はここにある

コードは、エラーを生成しますか?

EDIT:明確にするため

、私は相当になります関数の戻り値を持つことができるようにしたい:result*があるconst char (&) [*]なること

auto& result = bar; 

このようなサイズはbarです。

+1

これは "参照渡し"と呼ばれています:-) –

+0

@KerrekSB Hmmm ...私はもう少しエキゾチックなことを望んでいましたが、私はそれを仮定します: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が参照で渡さである" と言いますユーザーは「lvalueとして渡された」と言っているかもしれません。

+0

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

+0

これは私にとってはうまくいかないようです:http://ideone.com/kremY0 –

+0

Errr ...申し訳ありません。 'test'は' const char(&)[12] 'ではなく' const char *& 'です。サイズ出力は4です。 –