c++ - 如何初始化非默认构造的不可复制对象的元组?

标签 c++ tuples c++03 boost-tuples

给定一些具有参数化构造函数的类,例如:

class A
{
public:
    A(bool b, int i) { /*...*/ }
private:
    A(const A&) {}
};
class B
{
public:
    B(char c, double d) { /* ... */ }
private:
    B(const B&) {}
};

如何正确初始化此类类的元组?

boost::tuple<A,B> tup( /* ??? */ );

不使用 A 或 B 的复制构造函数,如果可能,也不使用移动构造函数。如果可能,首选 C++03 解决方案。

最佳答案

你能为你的类型添加一个分段构造函数吗?如果是这样,您可以创建一个可怕的宏来解包和委托(delegate)一个元组:

#define CONSTRUCT_FROM_TUPLE(CLS)                      \
    template <class... Ts>                             \
    CLS(std::tuple<Ts...> const& tup)                  \
        : CLS(tup, std::index_sequence_for<Ts...>{})   \
    { }                                                \
                                                       \
    template <class Tuple, size_t... Is>               \
    CLS(Tuple const& tup, std::index_sequence<Is...> ) \
        : CLS(std::get<Is>(tup)...)                    \
    { }

并将其添加到您的类型中:

struct A {
    A(bool, int ) { }
    A(const A& ) = delete;
    CONSTRUCT_FROM_TUPLE(A)
};

struct B {
    B(char, double ) { }
    B(const B& ) = delete;
    CONSTRUCT_FROM_TUPLE(B)
};

并传入元组:

std::tuple<A, B> tup(
    std::forward_as_tuple(true, 42), 
    std::forward_as_tuple('x', 3.14));

Pre-C++11,我不知道这是可能的——你根本没有委派构造函数。您必须:

  1. 自己写tuple -在其构造函数中接受元组的类似类
  2. 将元组构造函数添加到您的类型中,以显式初始化与非元组版本相同的东西
  3. 有一个可构造单参数类型的元组,例如 boost::tuple<boost::scoped_ptr<A>, boost::scoped_ptr<B>>(new A(...), new B(...))

(1) 工作量很大,(2) 代码重复且容易出错,(3) 现在不得不突然进行分配。

关于c++ - 如何初始化非默认构造的不可复制对象的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463220/

相关文章:

c++ - Qt:为什么在 QWidget 上声明 event() protected

python - 如何在 python 中创建相同元组的列表

c++ - 在重写方法中返回不同的枚举

c++ - 查找指向 NULL 的指针

Windows 中 UDP 的 C++ 头文件?

c++ - 关于嵌套类的 operator new 的重载解析

python - 在元组列表上使用二分法,但仅使用第一个值进行比较

python - StructType 不能接受 pyspark 中的对象 float

c++ - 尝试将 C++11 代码转换为 C++03 时默认函数模板参数出错

C++ 和 STL : Constructor Factory