匹配固定大小的CRTP类数组
Match fixed-size array of CRTP class
又是它的模板;-)给出以下模板成员函数和CRTP类:
template<typename T>
struct base
{
...
};
struct derived : public base<derived>
{
...
};
struct some_class
{
template<typename T>
void match(base<T>* array, size_t count)
{
...
};
template<typename T, size_t count>
void match(base<T> (&array)[count])
{
...
};
};
为什么编译器没有找到第二个函数的匹配项:
derived array[10];
some_class foo;
foo.match(array, 10); // works fine
foo.match(array); // Error: no matching function for call to some_class::match(derived array[10])
我希望第二个模板函数可以扣除编译时固定数组的大小,但显然没有考虑这个函数。为什么?
感谢编辑:奇怪的是,下面的版本编译得很好:
template<typename T, size_t count>
void match(T (&array)[count])
{
...
};
所以我怀疑,在某些时候,原始版本被排除在一些原因,我只是没有看到。
派生类不能转换为Base类数组。除了访问第一个构造函数中的第一个元素之外,如果你对数组做过任何事情,那就是未定义行为。
正确使用引用可以避免这种情况,因为代码无法编译。然而,它将通过将数组衰减为单个指针来编译,该指针可以衰减为指向Base的指针,这使得Base<T>*
重载可行,但仍然不好。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '