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

Specialization of a template class (array as input for the constructor)?

本文关键字:构造函数 输入 专门化 数组      更新时间:2023-10-16

假设我有一个模板类:

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

相关文章: