什么是这种模板机制,它是如何有用的?

时间:2016-02-13 12:33:30

标签: c++ templates

这可以使用模板来实现多态函数,但何时有机会指定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) {
   }
};

4 个答案:

答案 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 );