如何简化复杂的模板声明

时间:2012-05-29 23:48:25

标签: c++ c++11

例如,我想简化std::tr1::shared_pointer模板类。我想为std::tr1::shared_pointer添加别名。

但这不起作用:

#include <tr1/memory>

template <class T>
class SharedPointer : public std::tr1::shared_ptr<T>
{
};

int main(int argc, char *argv[])
{
    SharedPointer<int> test(new int(5));
    return 0;
}

由于构造函数不是继承的。

有解决方案吗?

2 个答案:

答案 0 :(得分:7)

如果要对其进行别名,using声明将创建一个真正的别名,而不是子类:

template<class T>
using SharedPointer = std::tr1::shared_ptr<T>;

修改

应该适用于GCC 4.6。*编译器的方法是围绕std::tr1::shared_ptr<T>创建一个包装函数。由于GCC 4.6。*支持C ++ 11库,我使用它而不是TR1:

#include <memory>
#include <utility>

template<typename T, typename... Args>
std::shared_ptr<T> make_shared_ptr(Args &&... args)
{
    return std::shared_ptr<T>(std::forward<Args>(args)...);
}

int main(int argc, char *argv[])
{
    auto test = make_shared_ptr<int>(new int(5));
    return 0;
}

答案 1 :(得分:5)

如果你没有使用C ++ 11,那么不幸的是你能做的最好的事情是:

template <class T>
struct SharedPointer
{
    typedef std::tr1::shared_ptr<T> type;
};

必须用作:

SharedPointer<int>::type x(new(int));