假设我有一个模板类:
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;
}
答案 0 :(得分:3)
&#34;如何找出数字n?&#34;
你不能。
使用std::array<>
代替(std::vector<>
如果你不知道编译时的实际大小),它们就是为解决这些问题而设计的。
相关问答:Can someone explain this template code that gives me the size of an array?
你可能仍然不想自己实现这一点,这可能很难在专业化中使用。
答案 1 :(得分:3)
您可以部分专注于已知大小的原始数组:
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)
之间,但可能比两者都差。