2016-04-25 68 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. –