使用原始指针作为参数的函数模板推导

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用原始指针作为参数的函数模板推导相关的知识,希望对你有一定的参考价值。

案例A:

template<class T>
    class A{
    public:
        A(T*)
        {
            cout<<"T*"<<endl;
        }
        template<class Y>
        A(Y*)
        {
            cout<<"Y*"<<endl;
        }
    };

然后打电话:

    A<int>p1(new int);      //T*
    A<int>p2(new double);   //Y*

我能理解这个案子。

案例B:

template<class T>
class B{
public:
    template<class Y>
    B(Y*)
    {
        cout<<"Y*"<<endl;
    }
};

然后打电话:

B<int>p3(new int);      //Y*
B<int>p4(new double);   //Y*

题:

我无法理解案例B并弄清楚为什么B<int>p3(new int);称之为B(Y*)?有人知道为什么吗?

答案

使用模板构造函数类型参数Y的类型推导不依赖于您使用T明确指定的类型参数B<int>

这意味着在以下情况下:

B<int>p3(new int)

Yint类型的论证推断为int*

同样,在以下情况下:

B<int>p4(new double)

Ydouble类型的论证推断为double*

类模板类型参数T和构造函数模板类型参数Y之间没有任何关联 - 它们的推导是分开执行的。

以上是关于使用原始指针作为参数的函数模板推导的主要内容,如果未能解决你的问题,请参考以下文章

带有函数指针和引用的模板参数推导[重复]

c++11-17 模板核心知识—— 理解模板参数推导规则

从std :: function中推导返回和参数类型作为模板函数参数传递?

用函数指针包装 C++ 代码作为 cython 中的模板参数

采用 Eigen::Tensor 的函数 - 模板参数推导失败

如何通过原始指针将闭包作为参数传递给 C 函数?