假设我有一个模板类:
template <typename T>
class TC
{
...
};
和两个正常类:
class A
{
...
};
class B : public A
{
...
}
,我可以显式实例化
TC<std::string> a(someString);
TC<int> a(5);
TC<A> a(someTestClassA);
TC<B> a(someTestClassB);
,我想特化模板类,使其可以接受动态数组作为构造函数输入:
TC<int[]> a(new int[5]);
TC<int[]> b(a);
TC<B[]> c(new B[5]);
如何在构造函数中"读取"数组的大小?
专门化将(我认为)如下:
template <typename T>
class TC<T []>
{
public:
TC() : ptr(new T[n]) { }
T * ptr;
};
如何找出数字n?
编辑:数字n在main函数中显式声明(因此,main在编译时知道这个数字,但我如何告诉TC[]构造函数n是什么?)例子:
TC<int[]> a(new int[5]); // in the TC[] class constructor, n should be 5
我想我正在寻找以下的类比(但对于类即构造函数):
template <typename T, size_t N>
void f( T (&a)[N])
{
for(size_t i=0; i != N; ++i) a[i]=0;
}
"如何找出数字n?"
你不能。
使用std::array<>
代替(或者std::vector<>
,如果你在编译时不知道实际大小),它们被设计用来解决这类问题。
相关的问题&A: 有人能解释这个模板代码,给我一个数组的大小?
您可能仍然不想自己实现这个,因为它很难在专门化中使用。
您可以对已知大小的原始数组进行部分专门化:
template <typename T, size_t N>
class TC<T[N]>
{
public:
TC() : ptr(new T[N]) { }
private:
T* ptr;
};
TC<int[4]> dynamic_array_of_4_ints;
虽然这是介于std::array<T, N> a
和std::vector<T> v(N)
之间,而且可能比两者都差。