匹配固定大小的CRTP类数组

Match fixed-size array of CRTP class

本文关键字:CRTP 数组      更新时间:2023-10-16

又是它的模板;-)给出以下模板成员函数和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>*重载可行,但仍然不好。