Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当(且仅当)对象具有复制构造函数时,如何复制该对象?_C++_Copy Constructor_Memoization - Fatal编程技术网

C++ 当(且仅当)对象具有复制构造函数时,如何复制该对象?

C++ 当(且仅当)对象具有复制构造函数时,如何复制该对象?,c++,copy-constructor,memoization,C++,Copy Constructor,Memoization,上下文:我试图记忆模板类的一个对象。现在,这个类是一个嵌套很深的数据结构,充满了唯一的指针,因此没有复制构造函数(据我所知,不可能缓存)。但是,在将来,如果有一个拷贝构造函数,我希望允许使用memonization。我尝试了以下代码: // some function here... { static std::unordered_map<State, Result> cache; return [c, ToValue](State state) { if (c

上下文:我试图记忆模板类的一个对象。现在,这个类是一个嵌套很深的数据结构,充满了唯一的指针,因此没有复制构造函数(据我所知,不可能缓存)。但是,在将来,如果有一个拷贝构造函数,我希望允许使用memonization。我尝试了以下代码:

// some function here... {
  static std::unordered_map<State, Result> cache;

  return [c, ToValue](State state) {
      if (cache.find(state) != cache.end()) {
        std::cout << "retrieving Literal from cache\n";
        if (std::is_copy_constructible<Result>::value) {
          return cache[state];
        }
      }
      // calculate and return a Result
//这里有一些函数。。。{
静态std::无序的映射缓存;
返回[c,ToValue](状态){
if(cache.find(state)!=cache.end()){

正如其他人所评论的,这个问题定义不清,有点混乱,但是你需要复制一个对象来缓存它吗

事实上,没有。您可以使用
std::shared_ptr
在创建者、任何使用者和缓存之间共享对象的所有权。如果没有其他内容,那么如果您的对象是一个复杂的对象,这将更加有效。它也适用于任何类型的对象,无论是否可复制

示例(我将使用单词
而不是
状态
,原因很明显)

鉴于这些声明:

class MyKey
{
    // ....
};

class MyCacheableObject
{
    // Constructor
    MyCacheableObject (int a, int b, int c) { ... }
    // ...
};

static std::unordered_map<MyKey, std::shared_ptr<MyCacheableObject>> cache;  // or std::map
然后,假设您有一个密钥计划稍后从缓存中检索对象,您可以执行以下操作:

MyKey someKey = ...;
std::shared_ptr<MyCacheableObject> newObject = CreateCacheableObject (1, 2, 3);

// ... setup / use `newObject` in whatever way is appropriate to your use-case 

cache [someKey] = newObject;
因此,这个问题根本不是关于一个对象是否可复制,而是关于(共享)所有权和
std::shared\u ptr
为您处理所有这些,您不必真正考虑它。Oy vay


有一个现场演示,展示了所有的编译过程。

正如其他人所评论的,这个问题定义得很不明确,有点混乱,但是你需要复制一个对象来缓存它吗

事实上,没有。您可以使用
std::shared_ptr
在创建者、任何使用者和缓存之间共享对象的所有权。如果没有其他内容,那么如果您的对象是一个复杂的对象,这将更加有效。它也适用于任何类型的对象,无论是否可复制

示例(我将使用单词
而不是
状态
,原因很明显)

鉴于这些声明:

class MyKey
{
    // ....
};

class MyCacheableObject
{
    // Constructor
    MyCacheableObject (int a, int b, int c) { ... }
    // ...
};

static std::unordered_map<MyKey, std::shared_ptr<MyCacheableObject>> cache;  // or std::map
然后,假设您有一个密钥计划稍后从缓存中检索对象,您可以执行以下操作:

MyKey someKey = ...;
std::shared_ptr<MyCacheableObject> newObject = CreateCacheableObject (1, 2, 3);

// ... setup / use `newObject` in whatever way is appropriate to your use-case 

cache [someKey] = newObject;
因此,这个问题根本不是关于一个对象是否可复制,而是关于(共享)所有权和
std::shared\u ptr
为您处理所有这些,您不必真正考虑它。Oy vay


有一个实时演示,显示所有这些都可以编译。

我猜想您得到的错误是
返回缓存[state];
在对象不可复制构造时无法编译。要修复此问题,您可以编写:

if constexpr (std::is_copy_constructible<Result>::value) {
      return cache[state];
    }
if constexpr(std::is\u copy\u constructible::value){
返回缓存[状态];
}

如果您仍然有问题,请发布一个有错误的帖子。

我猜您得到的错误是
返回缓存[state];
当对象不可复制构造时无法编译。要修复此问题,您可以编写:

if constexpr (std::is_copy_constructible<Result>::value) {
      return cache[state];
    }
if constexpr(std::is\u copy\u constructible::value){
返回缓存[状态];
}

如果您仍然有问题,请发布一条有错误的信息。

请发布一条显示未编译代码的信息。您可以尝试
If constexpr(std::is_copy_constructible
…,但是如果返回的内容是错误的,那么您也应该返回一些内容如果
Result
不是copy constructible,那么您希望返回什么内容呢?请考虑返回类型。这样,如果
Result
不是copy constructible,您就可以返回一些内容。这些都与copy无关如果我读对了问题,请看下面我的答案。请发布一个显示不可编译代码的帖子。你可以尝试
if constexpr(std::is_copy_constructible
…,但是如果返回的内容是错误的,那么您也应该返回一些内容如果
Result
不是copy constructible,那么您希望返回什么内容呢?请考虑返回类型。这样,如果
Result
不是copy constructible,您就可以返回一些内容。这些都与copy无关如果我没有看错问题,请看下面的答案。非常感谢您的详细回答!但是,使用共享指针不允许修改缓存中的对象吗?该函数可以返回指向该对象的共享指针,并缓存指向该对象的另一个共享指针;然后,使用该函数的人可能会发生变异e对象,导致缓存现在坏了。当然。我对你的应用程序一无所知,所以只有你才能决定这是否真的是你的问题。非常感谢你的详细响应!但是,使用共享指针不允许修改缓存中的对象吗?该函数可以返回指向对象的共享指针对象,并缓存指向该对象的另一个共享指针;然后,使用该函数的人可能会对该对象进行变异,从而导致缓存现在已损坏。当然,我对您的应用程序一无所知,因此只有您可以决定这是否真的是您的问题。