我怎样才能复制模板T的参数列表,如make_shared <t>()</t>

时间:2012-02-29 15:07:21

标签: c++ templates

我注意到make_shared()做了一些整洁的事情,我很奇怪这是如何工作的...... make_shared()复制并验证T的构造函数的参数列表。这是如何工作的?如何设计我自己的模板函数来复制和验证T的可用构造函数?

示例:

#include <memory>
#include <iostream>
#include <string>

using namespace std;

class Department
{
public:
        string Name;
        double Budget;
        Department(const string& name, const double& budget);
};

Department::Department(const string& n, const double& b)
        : Name(n), Budget(b)
{
        cout << Name << " : " << Budget << endl;
}

int main()
{
        shared_ptr<Department> d = make_shared<Department>("Human Resources", 1000.0);
        // shared_ptr<Department> d = make_shared<Department>(); NOT VALID
        return 0;
}

以上在make_shared()的编译时验证;使用参数const string&amp;和const double&amp ;.我怎么能在我自己的代码中模仿这种行为?

2 个答案:

答案 0 :(得分:3)

这是使用完美转发(std::forward())完成的。您可以阅读here(确保继续阅读下一页的解决方案)和here

答案 1 :(得分:2)

这里没有真正的验证。 make_shared会盲目地尝试 如果参数有参数,则将参数转发给构造函数 收到不匹配的编译器将拒绝编译代码。

这是通过两件事来实现的:

  • 可变参数模板参数
  • 完美转发

可变参数确保make_shared接受 任意长度的参数列表(甚至是空列表)和完美 转发允许这些参数具有任意类型。