将逗号分隔的参数传递给<<运算符

Alm*_*ely 1 c++ operator-overloading c++11

我正在尝试Eigen为容器类完成类似于高级初始化的操作.

即在main,我想填写类型的对象DynamicArray如下:

main.cpp中

// Create 3 x 3 Dynamic array and fill with 0's
DynamicArray da(3, 3, 0);

da << 1, 2, 3,
      4, 5, 6,
      7, 8, 9;
Run Code Online (Sandbox Code Playgroud)

我用来尝试实现此目的的方法是:

DynamicArray.hpp

template <typename T>
class DynamicArray {

        // ...

public:

        // ...

    template <typename... Args,
              typename = typename std::enable_if<ArgPackSameTruth<
                                             std::is_convertible<Args, T>...>::value,
                                             T>::type
    > void operator<<(Args... x) {

        typename std::vector<T> arg_vect{std::forward<Args>(x)...};

        std::cout << arg_vect.size() << "\n";

        // Load contents of arg_vect into *this...

        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译时main.cpp,我得到1的大小arg_vect,所以只有第一个参数被接受.我怎样才能确保所有参数都被传递?

谢谢!

Dan*_*rey 5

操作顺序与您的想法不同.如果你有:

da << 1, 2, 3;
Run Code Online (Sandbox Code Playgroud)

它相当于(给定自由运算符):

auto tmp1 = operator<<(da,1);
auto tmp2 = operator,(tmp1,2);
auto tmp3 = operator,(tmp2,3);
Run Code Online (Sandbox Code Playgroud)

因此你需要大致像这样的运营商:

#include <iostream>

struct DynamicArray
{
};

DynamicArray& operator<<( DynamicArray& da, int i )
{
    std::cout << "<<" << i << std::endl;
    return da;
}

DynamicArray& operator,( DynamicArray& da, int i )
{
    std::cout << "," << i << std::endl;
    return da;
}

int main()
{
    DynamicArray da;
    da << 1, 2, 3,
          4, 5, 6,
          7, 8, 9;
}
Run Code Online (Sandbox Code Playgroud)

实例

当然,您需要将值存储在某处,等等.考虑一个允许这样做的设计,并考虑添加一个中间类来保存返回的值,operator<<它既可以作为第一个输入参数,也可以作为返回类型operator,.如果需要,该类的析构函数可用于应用收集的中间数据.