有没有更简洁的方法来使用互斥锁定义我的复制构造函数?

Is there a cleaner way to define my copy ctor with a mutex?

我有一个像这样的 POD 结构

struct foo {
  std::mutex m_foo_mutex;
  int a;
  int b;
  int c;
  //......
};

它的字段比这多,但结构应该很明显。默认的复制构造函数当然是错误的,因为 std::mutex 的复制构造函数是 delete.

复制这个对象并为复制的对象提供一个新的互斥量对我来说完全没问题。所以我在 foo.

里面定义了这样的东西
foo(const foo &foo2) : m_foo_mutex() {
a = foo2.a;
b = foo2.b;
c = foo2.c;
//.......
}

这一切都很好,但是当这个结构有 20 多个字段时它很难看,通常编译器会向我隐藏它。有没有更简洁的方式来表达这一点,还是我被这个又大又丑的构造函数困住了?

您可以将您的互斥量包装在可复制的 class:

struct CopyableMutex {
    std::mutex mutex;

    CopyableMutex() = default;
    CopyableMutex(const CopyableMutex&) {};
    CopyableMutex& operator= (const CopyableMutex&) {
        return *this;
    };
};

struct foo {
  CopyableMutex m_foo_mutex;
  int a;
  int b;
  int c;
};

虽然你可能想要一个比 CopyableMutex 更好的名字,因为显然它实际上并没有复制互斥体!