C++模板类内二维数组引用初始化的问题


   
  //一维数组的引用传递
  
#include <iostream>
#include<string>
using namespace std;
template<class T,int size>
void Print(const T (&a)[size])
{
for(int i=0;i<sizeof(a)/sizeof(T);++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main()
{
string ab[] = {"a1","a2","a3","a4","a5","a6"};
Print<string>(ab);
return 0;
}

输出
a1 a2 a3 a4 a5 a6
问题一: 二维数组的引用传递这么写?请牛人指教。

   
  //错误写法
  
#include <iostream>
#include<string>
using namespace std;
template<class T,int size>
void Print(const T (&a)[][size])
{
for(int i=0;i<sizeof(a)/sizeof(T);++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main()
{
string ab[][3] = {"a1","a2","a3","a4","a5","a6"};
Print<string>(ab);
return 0;
}

问题二: 模板类中的 一维数组的引用的大小 能不能根据“参数”动态决定??(类似于第一个代码例子那样)。 即

   
  #include <iostream>
  
#include<string>
using namespace std;
template<class T,int size>
class ArrayProxy
{
private:
T (&a)[size];
public:
ArrayProxy(T (&va)[size]):a(va){}
void Print()
{
for(int i =0; i<sizeof(a)/sizeof(T);++i)
{
cout<<a[i]<<" ";
}
}
};
int main()
{
string ab[6] = {"b1","b2","b3","b4","b5","b6"};
ArrayProxy<string,6> ap(ab);
//问题二:
//这里为什么不是ArrayProxy<string> ap(ab)这么写,根据传入的参数ab.然后判断size的大小,而非自己计算传进去。 (类似于第一个代码例子那样)
ap.Print();
return 0;
}

STL(C++) C++

金仴靈金仴靈 11 years, 4 months ago

模板函数的参数是可以自动推断的,但模板类的参数不能自动推断。所以如果写成类的话,就必须完整写出需要的参数了。
可以定义一个静态模板函数返回一个模板类实例,不过如果要存在变量里面的话还是得明确写出参数。

蔚蓝D瓶子 answered 11 years, 4 months ago

Your Answer