我在来自 c++ 机器库(dlib)的类中有一个 typedef,如下所示:
typedef dlib::matrix<double, 64, 1> sample_type;
除了 64 实际上是一个变量。我希望 typedef 在整个类中可见,但我希望第二个参数(64)是调用构造函数时的参数。我怎样才能做到这一点,同时保持 typedef 随处可见?
这在当前设计中是不可能的,因为模板参数必须在编译时知道,而构造函数的参数没有这个限制。
这样做的原因是因为任何模板扩展都应该被视为它自己的类型;模板参数是类型的一部分(std::vector<int>
与 不同的类型std::vector<float>
)。
这实际上是dlib 网页上的常见问题之一。你要做的是:
typedef dlib::matrix<double, 0, 1> sample_type;
sample_type myvect(64); // now the 64 is a runtime argument.
作为一般情况,这是不可能的。尽管您可能想要编写以下内容:
template <int matrix_size>
struct sample_type : public dlib::matrix<double, matrix_size, 1>
{
sample_type data1;
sample_type<16> data2;
};
sampe_type<32> var32;
sampe_type<36> var36;
请注意,在模板内部定义了 2 个数据字段。第一个数据字段将使用当前实例化参数创建。第二个数据字段将使用显式参数创建。
如您所见,在模板内部它似乎是您想要的,但在外部只能使用常量。