模板类的专门化(数组作为构造函数的输入)?

时间:2015-06-05 20:12:26

标签: c++ arrays

假设我有一个模板类:

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;
}

2 个答案:

答案 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> astd::vector<T> v(N)之间,但可能比两者都差。