我厌倦了撰写std::shared_ptr<MyClass>
和std::make_shared<MyClass>
,在考虑this后,我希望找到更短的语法。
对于我的短期科学项目,我经常只需要非常快速地生成代码并且更喜欢严格的语法 - 只是不要对它进行评论;)
所以我想这个:
#define PTR(X) std::shared_ptr<X>
#define NEW(X) std::make_shared<X>
PTR(MyClass) p = NEW(MyClass)(args)
或关于此:
template<typename T> using ptr = std::shared_ptr<T>;
template<typename T, typename... Args>
ptr<T> make(Args... args) {
return std::make_shared<T>(args...);
}
ptr<MyClass> p = make<MyClass>(args);
您认为这些方法的优点/缺点是什么?还有更优雅的方式吗?
答案 0 :(得分:7)
using std::make_shared; // at file scope, after all #includes
auto p = make_shared<Bob>(a,b,c);
但我个人喜欢std::
。
使用auto
是好的,因为在同一行重复两次类型是不必要的噪音。
答案 1 :(得分:4)
你可以使用自动
auto p = std::make_shared<MyClass>(args);
答案 2 :(得分:4)
您认为这些方法的优点/缺点是什么?
他们太可怕了。它相当于
#define R return
我看过,因为有人懒得写return
。
问题在于,在软件开发中,大部分时间花在思考如何做和代码维护上。通过使用这样的宏,你正在削弱维护,使维护者的生活更加艰难。
有更优雅的方式吗?
使用正确的IDE,设置自动完成以触发一个字符,然后选择您需要的任何内容。
好的,我跳过了模板示例。
您正在引入新符号,并编写typedef以使自己编写更少的代码。最好的代码是没有写的代码。
如果有人打开您的源文件,他还必须打开您定义这些功能和模板别名的标题。这会增加维护成本。
看到std::shared_ptr
,人们立即知道它是什么。
另外,你会为std::unique_ptr
做些什么?添加make1
和ptr1
?
答案 3 :(得分:-4)
如前所述,使用auto和expand命名空间。
using namespace std;
....
auto allocatedInstance = make_shared<Type>(args);