匹配CRTP类的固定大小数组

时间:2011-10-24 14:13:20

标签: c++ templates

再次

其模板;-)给出以下模板成员函数和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])

我希望第二个模板函数可以减去编译时fixde数组大小,但显然不考虑该函数。为什么呢?

由于

编辑:奇怪的是以下版本编译得很好:

    template<typename T, size_t count>
    void match(T (&array)[count])
    {
        ...
    };

所以我怀疑在某些时候,由于某种原因我原先的版本被排除了。我只是看不到。

1 个答案:

答案 0 :(得分:1)

Derived 数组不能转换为Base数组。如果您对数组执行了任何操作,除了访问第一个构造函数中的第一个元素,那么它将是Undefined Behavior。

正确引用引用可以保护您免受这种情况的影响,因为代码无法编译。但是,将通过将数组衰减到单个指针来进行编译,该指针可以衰减到指向Base的指针,这使得Base<T>*重载可行,但仍然很糟糕。