C ++模板参数T(*)[]

时间:2017-06-25 13:53:26

标签: c++ arrays templates

以下是Visual Studio 2017社区版std::default_delete的源代码。

template<class _Ty>
struct default_delete<_Ty[]>
{
    // default deleter for unique_ptr to array of unknown size
    constexpr default_delete() _NOEXCEPT = default;

    template<class _Uty, class = typename enable_if<is_convertible<_Uty(*)[], _Ty(*)[]>::value, void>::type>
    default_delete(const default_delete<_Uty[]>&) _NOEXCEPT
    {
        // construct from another default_delete
    }

    template<class _Uty, class = typename enable_if<is_convertible<_Uty(*)[], _Ty(*)[]>::value, void>::type>
    void operator()(_Uty *_Ptr) const _NOEXCEPT
    {
        // delete a pointer
        static_assert(0 < sizeof (_Uty), "can't delete an incomplete type");
        delete[] _Ptr;
    }
};

我注意到数组专精化中_Uty(*)[]中的模板参数_Ty(*)[]is_convertible<_Uty(*)[], _Ty(*)[]>

如果是_Ty(&)[]那么我肯定知道它是对_Ty类型数组的引用,如post所述,但对_Ty(*)[]的含义没有任何线索。 如果有人能够阐明这个充满异国情调的模板参数,那将会非常有用。

修改 非常感谢你们所有人!我设法安装了一个指向数组的函数。

template <typename T>
T* func0(T(*parr)[], std::initializer_list<T> args)
{
    int i = 0;
    for (T arg : args)
        (*parr)[i++] = arg;
    return *parr;
}

template <typename T, unsigned S>
T* func1(T(*parr)[S], std::initializer_list<T> args)
{
    int i = 0;
    for (T arg : args)
        (*parr)[i++] = arg;
    return *parr;
}

int main(void)
{
    std::string strs[5];
    //std::string* pstrs = func1(&strs, {"133", "233", "333", "433", "533"}); // Not working! Cannot deduce template param T from args
    std::string* pstrs = func1<std::string, 5>(&strs, {"133", "233", "333", "433", "533"}); // Works fine!
    //std::string* pstrs = func0<std::string, 5>(&strs, {"133", "233", "333", "433", "533"}); // Not working! No instance of function template match
    return 0;
}

我想知道为什么模板参数T不能从传递给func1的args中推断出来? 此外,似乎S中的尺寸信息T(*parr)[S]是必须的。

1 个答案:

答案 0 :(得分:3)

_Ty(&amp;)[]是对C风格数组的引用。

_Ty(*)[]是指向C风格数组的指针。