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

标签 c++ arrays templates

<分区>

这是std::default_delete的源代码来自 Visual Studio 2017 社区版。

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 的参数推导出来? 另外,尺寸信息似乎ST(*parr)[S]是必须的。

最佳答案

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

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

关于C++ 模板参数 T(*)[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44747040/

相关文章:

c++ - 改进稀疏线性系统的解决方案

javascript - Meteor - 添加了数组项目类,但是如何添加?

java - 将数组传递给构造函数而不声明它?

c++ - 这被认为是显式 C++ 模板类实例化吗?

java - Eclipse 自定义热键 - 将当前行打印到标准输出

c++ - 双右尖括号 (>>) 在特定情况下会产生语法错误

c++ - 以零开头的数字有什么特别之处?

c++ - Qt从控制台读取并按Enter停止

c++ - 寻找整数可以表示为唯一自然数的 n 次幂之和的方法。给出错误输出的代码

arrays - 在 Matlab 中显示字体颜色