这可以使用模板来实现多态函数,但何时有机会指定U
模板类型?我不明白到底发生了什么。
除了解释之外,我想要一个答案,其中还包括适用的用例。
以下是模板示例:
template<typename T>
class some_class
{
public:
some_class(const some_class<T>& other) {
}
template<typename U>
some_class(const some_class<U>& other) {
}
};
答案 0 :(得分:2)
标准库智能指针就是很好的例子。
(简化的)
template <class T>
class unique_ptr
{
public:
template <class U>
unique_ptr(unique_ptr<U>&& u);
};
这允许unique_ptr
将派生类型(U
)移动到unique_ptr
到基本类型(T
)。
答案 1 :(得分:2)
可以自动推导出功能模板参数,因此无需指定U的类型。
你可以写:
some_class<float> x(some_class<int>{});
和U将自动推断为int
类型。
答案 2 :(得分:1)
用例
some_class<int> x; // assuming there is a suitable default constructor
some_class<float> y(x);
当然,通常会期望构造函数(模板化或非模板化)会以允许此类操作有意义的方式执行某些有用的操作。
答案 3 :(得分:0)
这是一个简单的转换构造函数,与模板没有任何关系。它允许将不同类型转换为当前类型。智能指针很常见,派生类的转换可以隐式转换为基类。
#include <iostream>
#include <memory>
template<typename T>
class Base
{
};
template<typename T>
class Derived : public Base<T>
{
};
template<typename T>
std::unique_ptr<Derived<T>> createDerived()
{
return std::make_unique<Derived<T>>();
}
int main()
{
std::unique_ptr<Base<int>> base = createDerived<int>();
return 0;
}
在上面的示例代码中,由于转换构造函数,std::unique_ptr<Derived<int>>
类型会自动转换为std::unique_ptr<Base<int>
。智能指针尝试尽可能接近地模拟原始指针,这是一个非常有用的属性。
std::unique_ptr
documentation显示有一个允许此转换的构造函数。
(6)
template< class U, class E > unique_ptr( unique_ptr<U, E>&& u );