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,所以只有第一个参数被接受.我怎样才能确保所有参数都被传递?
谢谢!
操作顺序与您的想法不同.如果你有:
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,.如果需要,该类的析构函数可用于应用收集的中间数据.