将数组模板参数用于 Return
Using the Array Template Parameter for a Return
(我似乎找不到这个范式的名称,但如果可以的话,你会得到一个额外的投票!)这个模板范式用于防止数组衰减为指针:
template <size_t N>
void foo(const char (&bar) [N]);
我们可以在 foo
的正文中使用 N
来减小尺寸 bar
。给定 const char array[] = "lorem ipsum"
我们使用此调用 foo(array)
将 bar
定义为 const char (&) [12]
,有效地以一个价格传递 2 个参数。
我想在 return 中使用同样的想法,例如:
template <size_t N>
const char (&) [N] foo(const char (&bar) [N]);
这样我就可以传递数组,并有另一个对它的引用,例如:auto result = foo(bar)
我这里的代码产生错误:
unrecognizable template declaration/definition
这可能吗?
编辑:
为澄清起见,我希望能够有一个函数 return,其结果相当于:
auto& result = bar;
这样 result
将是 const char (&) [*]
,其中 *
是 bar
的大小。
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
is passed by reference”,尽管更有眼光的用户可能会说 "passed as an lvalue"(并且原样返回)。
(我似乎找不到这个范式的名称,但如果可以的话,你会得到一个额外的投票!)这个模板范式用于防止数组衰减为指针:
template <size_t N>
void foo(const char (&bar) [N]);
我们可以在 foo
的正文中使用 N
来减小尺寸 bar
。给定 const char array[] = "lorem ipsum"
我们使用此调用 foo(array)
将 bar
定义为 const char (&) [12]
,有效地以一个价格传递 2 个参数。
我想在 return 中使用同样的想法,例如:
template <size_t N>
const char (&) [N] foo(const char (&bar) [N]);
这样我就可以传递数组,并有另一个对它的引用,例如:auto result = foo(bar)
我这里的代码产生错误:
unrecognizable template declaration/definition
这可能吗?
编辑:
为澄清起见,我希望能够有一个函数 return,其结果相当于:
auto& result = bar;
这样 result
将是 const char (&) [*]
,其中 *
是 bar
的大小。
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
is passed by reference”,尽管更有眼光的用户可能会说 "passed as an lvalue"(并且原样返回)。