我有一个模板函数bar,它将对数组的引用作为参数。我想接受参数并将其传递给另一个函数,但只是在将数组的大小减小一个并跳过数组的第一个元素之后。
#include <iostream>
template <typename T>
void foo(const T& t)
{
std::cout << sizeof(t) << std::endl;
std::cout << t[0] << std::endl;
}
template <typename T>
void bar(const T& t)
{
std::cout << sizeof(t) << std::endl;
std::cout << t[0] << std::endl;
foo(t); // Magic is desired here!
}
int main()
{
char array[] = "ABCD";
bar(array);
}
以上打印出来:
5
A
5
A
我希望打印出来:
5
A
4
B
答案 0 :(得分:5)
您可以使用两个模板参数执行此操作,一个用于数组类型,另一个用于数组大小。
template <typename T, int N>
void bar(const T (&t)[N])
{
// ...
foo(reinterpret_cast<const T(&)[N-1]>(t[1]));
}
答案 1 :(得分:1)
可能需要复制数组才能获得参考。我希望这个答案会引起人们对你问题的真实主题的关注。
使用适当的(和通用)强制转换来调用foo,如下所示
reinterpret_cast<typename std::remove_reference<decltype(t[0])>::type [sizeof(t)-1]>(t+1)
但上面的内容无效 - 你不能将const char *转换为const char [4];此外,您无法以其他方式获取引用,因为无法复制数组。所以你可能需要在c ++ 11中复制或使用std :: array,这实际上归结为有两个模板参数。
这是一个有效的解决方案:
typedef typename std::remove_reference<decltype(t[0])>::type element_type;
foo(reinterpret_cast<element_type(&) [sizeof(T)-1]>(t[1]));