使用数组模板参数返回

时间:2016-04-25 13:30:31

标签: c++ arrays templates reference size

(我似乎找不到这个范例的名称,但如果可以的话,你会得到一个奖励upvote!)这个模板范例用于防止数组衰变为指针:

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

Live Example

我们可以在N的正文中使用foo来缩小bar的大小。鉴于const char array[] = "lorem ipsum",我们使用此调用foo(array)bar定义为const char (&) [12],有效地传递2个参数,价格为1。

我想使用同样的想法,但在回报中,例如:

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

这样我就可以传递数组,并对其进行另一次引用,例如:auto result = foo(bar)

我在这里的代码会产生错误:

  

无法识别的模板声明/定义

这可能吗?

修改

为了澄清,我希望能够有一个函数返回,它将导致相当于:

auto& result = bar;

这样result将是const char (&) [*],其中*的大小为bar

1 个答案:

答案 0 :(得分:4)

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 通过引用传递”,尽管更挑剔的用户可能会说“作为左值传递”(并且也会这样返回)