模板类的专门化(数组作为构造函数的输入)
Specialization of a template class (array as input for the constructor)?
假设我有一个模板类:
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)
之间,而且可能比两者都差。
相关文章:
- 在构造函数中输入对象时C++类成员作用域
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 如何在C++中将构造函数的新输入推回构造函数的默认输入?
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 如何使输入文本文件成为构造函数参数?c++
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- std::具有两个输入参数的矢量构造函数
- 如何实现构造函数,使其仅接受使用 typeid 的输入迭代器?
- C++参数化构造函数使代码在传递大输入时停止工作
- 两个构造函数(带和不带参数),没有输入 -> 没有参数运行。跳过上述类中的构造函数
- 如何正确访问通过引用从标准输入传递给构造函数的参数的值
- 默认构造函数 Eclipse 项目中的用户输入
- 如何为作为雇员类的指针传入的构造函数输入数据
- 如何解析文本文件并使用构造函数中的文件输入来创建对象的容器
- 如何使用我的输入制作构造函数?
- 尝试声明构造函数时,输入末尾的预期"{"
- 如何将用户输入存储在变量中,该变量与默认构造函数中的变量初始化中的值不同
- 根据输入参数值调用不同的基类构造函数
- 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是类的构造函数C++
- 构造函数错误:输入末尾的预期“{”