如何简化复杂的模板声明

Mar*_*dik 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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

有没有解决这个问题的模式?

Ken*_*nde 7

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

template<class T>
using SharedPointer = std::tr1::shared_ptr<T>;
Run Code Online (Sandbox Code Playgroud)

编辑

一个应该适用于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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Mehrdad:这不是有效的C++.发明使用`using'别名来提供完全相同的功能. (2认同)
  • 该标准提供了`std :: make_shared`,它有点像你的功能,但实际上要好得多,因为它可以采用很好的优化.阅读它. (2认同)

Edw*_*per 5

如果您不使用C++ 11,那么不幸的是,您可以做的最好的事情是:

template <class T>
struct SharedPointer
{
    typedef std::tr1::shared_ptr<T> type;
};
Run Code Online (Sandbox Code Playgroud)

必须用作:

SharedPointer<int>::type x(new(int));
Run Code Online (Sandbox Code Playgroud)

  • 啊,对,好点 - 我只是把它改成了一个`struct`,它具有相同的效果,但稍微不那么冗长. (2认同)