- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
很抱歉这个问题太长了,但一些上下文是必要的。我有一些代码似乎对我正在从事的项目很有用:
class Foo
{
public:
Foo( int bar = 1 );
~Foo();
typedef std::shared_ptr< Foo > pointer_type;
static pointer_type make( int bar = 1 )
{
return std::make_shared< Foo >( bar );
}
...
}
如您所见,它提供了一种将任何类构造为 PointerType 的直接方法,该类将 shared_ptr 封装到该类型:
auto oneFoo = Foo::make( 2 );
因此,您无需在整个代码库中引用 make_shared 和 shared_ptr 即可获得 shared_ptr 的优势。
在类中封装智能指针类型有几个优点:
但是,如果不直接键入必需的 typedef 和静态 PointerType Instance() 函数,我看不出有什么明显的方法可以将这段代码应用于我项目中的所有类。我怀疑应该有一些一致的、C++11 标准的、跨平台的方法来使用基于策略的模板来做到这一点,但是一些实验还没有找到一种明显的方法来将这个平凡地应用到一个类中的一堆类中。在所有现代 C++ 编译器上进行干净编译的方式。
您能想出一种优雅的方式来将这些概念添加到一堆类中,而无需进行大量剪切和粘贴吗?一个理想的解决方案会在概念上限制可以为哪些类型的类创建哪些类型的指针(一个类使用 shared_ptr 而另一个使用原始指针),并且它还将通过其自己的首选方法处理任何受支持类型的实例化。这样的解决方案甚至可以通过在编译时适本地失败来处理和/或限制非标准和标准智能和哑指针类型之间的强制转换。
最佳答案
一种方法是使用 curiously recurring template pattern .
template<typename T>
struct shared_factory
{
using pointer_type = std::shared_ptr<T>;
template<typename... Args>
static pointer_type make(Args&&... args)
{
return std::make_shared<T>(std::forward<Args>(args)...);
}
};
struct foo : public shared_factory<foo>
{
foo(char const*, int) {}
};
我相信这会给你你想要的。
foo::pointer_type f = foo::make("hello, world", 42);
我不推荐使用这种方法。试图规定类型的用户如何实例化该类型是不必要的限制。如果他们需要一个 std::shared_ptr
,他们可以创建一个。如果他们需要 std::unique_ptr
,他们可以创建一个。如果他们想在堆栈上创建一个对象,他们可以。我认为强制要求如何创建和管理用户的对象不会有任何好处。
解决您的问题:
- It lets you control the copyability and moveability of the pointer types.
这有什么好处?
- It hides the shared_ptr details from callers, so that non-trivial object constructions, such as those that throw exceptions, can be placed within the Instance() call.
我不确定你在这里的意思。希望您不会捕获异常并返回 nullptr
。那将是 Java 级的错误。
- You can change the underlying smart pointer type when you're working with projects that use multiple smart pointer implementations. You could switch to a unique_ptr or even to raw pointers for a particular class, and calling code would remain the same.
如果您正在使用多种智能指针,或许让用户根据给定情况选择合适的种类会更好。此外,我认为具有相同的调用代码但返回不同类型的句柄可能会造成混淆。
- It concentrates the details about (smart) pointer construction and aliasing within the class that knows most about how to do it.
一个类在什么意义上“最”了解如何进行指针构造和别名?
- It lets you decide which classes can use smart pointers and which classes must be constructed on the stack. The existence of the PointerType field provides a hint to callers about what types of pointers can be created that correspond for the class. If there is no PointerType defined for a class, this would indicate that no pointers to that class may be created; therefore that particular class must be created on the stack, RAII style.
同样,我从根本上不同意某种类型的对象必须以某种方式创建和管理的想法。这是 singleton pattern 的原因之一。太阴险了。
关于C++11 make_shared 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953783/
我在 boost::asio 中做了一个 echo-server 示例。但是使用 boost::make_shard 会导致“未知异常”,而 std::make_shared 则不会。请参阅注释行。
我一直在做一些现场性能测试 1>std::shared_ptr, std::make_shared based on 'gcc 4.7.2' & 'VC10 implementation' 2>boo
问题 1> Line 1 的使用率真的比 Line 2 好吗? boost::shared_ptr shpStr = boost::make_shared(); // Line 1 boost::sh
正如 Bjarne Stroustrup 的“C++ 之旅”中所述,作为一种已知的 C++14 实践,人们应该避免在代码中使用裸露的 new 和 delete。标准库提供 std::make_shar
这可能是重复的,但我无法在任何地方找到解决方案。 我有这样的源代码: struct Blob{ //... static void *operator new(size_t si
我有一个带有模板构造函数的类,并且想要一个 shared_pointer给它。如: class A; typedef std::shared_ptr A_ptr; class A { public:
将 VS 2015 与 v120 结合使用。 所以我得到了内存异常,因为当我在一个已经构造的对象上调用 make_shared() 时。已经构造的对象有一个指向另一个用 new 分配的对象的指针,所以
在this回答 T.C.州 boost::make_shared etc. support array types - either one of unknown size, or one of fi
虽然我有std::tr1::shared_ptr在我的编译器中可用,我不有make_shared . 谁能告诉我如何正确实现 make_shared ?我懂了我需要使用可变参数来为 T 的构造函数提供
我正在尝试自己实现 shared_ptr。 make_shared 有问题。 std::make_shared 的主要特点是它在连续的内存块中分配计数器 block 和对象。我怎样才能做同样的事情?
除非定义了 B0RKEN(就像命令行上的 -DB0RKEN 一样),否则编译以下内容: #include #include #include using boost::shared_ptr; u
有什么方法可以使用 make_shared 而不是 shared_ptr 作为抽象类型? 例子: #include #include class Foo { public: virtual
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我明白了: shared_ptr x = make_shared(); 效率高于: shared_ptr x(new X()); 而且我了解其中的优势。但是,我不明白为什么编译器不能有这样的规则 "i
使用 gcc 4.6.2,如果构造函数抛出异常,make_shared() 会给出无用的回溯(显然是由于某些重新抛出)。我正在使用 make_shared() 来节省一些输入,但这是显示停止器。我创建
从 C++11 开始,由于多种原因,开发人员倾向于将智能指针类用于动态生命周期对象。对于那些新的智能指针类、标准,甚至建议不要使用像 new 这样的运算符,而是建议使用 make_shared 或 m
从理论上讲,make_shared() 和shared_ptr 之间的一个区别是内存分配技术。 make_shared() 应该使用一个 block ,而 shared_ptr 应该使用两个 bloc
为了规避restriction on partially supplied explicit template arguments ,我将要从中推导出类模板参数 ( Internal ) 的结构嵌
为什么这个 make_shared 在两个单独的调用中分配相同的内存地址? typedef struct { int a; int b; int c; } test_t; vo
我最近正在处理 shared_ptr 的问题。我很好奇如果 make_shared 失败了,它会引发异常吗?是否存在 make_shared 返回 nullptr 但没有任何异常的情况? 最佳答案 来
我是一名优秀的程序员,十分优秀!