C++ c++;-使用逗号分隔值初始化矩阵

C++ c++;-使用逗号分隔值初始化矩阵,c++,C++,嗨,我偶然发现了这张照片。它演示了如何使用dlib库的矩阵结构 根据这一点,可以通过以下方式初始化矩阵结构: M = 54.2, 7.4, 12.1, 1, 2, 3, 5.9, 0.05, 1; 这怎么可能在C++中? 这是某种运算符重载吗?逻辑 这可以通过重载运算符、(运算符逗号)实现,例如,使其将新的浮点值推入M 需要注意的是,运算符,应该至少有一个类类型的参数,因此您必须创建一个隐式转换为浮点值的类(例如,通过一个非显式构造函数,该构造函数有一个d

嗨,我偶然发现了这张照片。它演示了如何使用dlib库的矩阵结构

根据这一点,可以通过以下方式初始化矩阵结构:

M = 54.2,  7.4,  12.1,
    1,     2,    3,
    5.9,   0.05, 1;
<>这怎么可能在C++中? 这是某种运算符重载吗?

逻辑 这可以通过重载
运算符、
(运算符逗号)实现,例如,使其将新的浮点值推入
M

需要注意的是,
运算符,
应该至少有一个类类型的参数,因此您必须创建一个隐式转换为浮点值的类(例如,通过一个非
显式
构造函数,该构造函数有一个
double
float
类型的参数)

例子 例如,我们将尝试对
std::vector
上的包装器类型执行此操作,并尝试使
M=1,2,3,4,5
成为一个有效的表达式,从而生成一个带有顺序元素的
std::vector
。您将看到,这很容易适用于您给出的矩阵示例

需要记住的是,
运算符=
运算符具有更高的优先级,
(如中所示);因此,
M=1,2,3,4,5
将真正被解析为:
(((((((((((((((((((())1),2),3),4),5)

考虑到这一点,我们将首先创建类
container
,其中包含一个
操作符=
,该操作符接受一个值并将其推入容器中:

template<typename ValueType>
struct container {
    
    explicit container(std::size_t n) {
        vec.reserve(n);
    }
    
    container& operator=(ValueType a) {
        vec.push_back(a);
        return (*this);
    }

    std::vector<ValueType> vec;
    
};
它只是向后推一个新元素值

现在,您可以很容易地看到,以下内容工作正常,可以打印
123445

int main() {
    container<int> M(5);
    M = 1, 2, 3, 4, 5;
    for (auto i : M.vec) std::cout << i << ' ';
}
然后简单地使用括号:

int main() {
    container<int> M(5);
    M = { 1, 2, 3, 4, 5 };
    for (auto i : M.vec) std::cout << i << ' ';
}
intmain(){
容器M(5);
M={1,2,3,4,5};

对于(auto i:M.vec)std::cout为了读者的理智,我建议你不要试图模仿这个怪物。我建议使用
std::initialiser\u list
giving
M={…};
你如何知道形状(3,3)?@RuggeroTurra它在对象
M
at
矩阵M(3,3)的初始化中传递给构造函数这就是为什么C人讨厌C++ + Paulm这也是为什么C++人讨厌那些超载<代码>操作符> 的人所写的C++的原因。
container& operator=(std::initializer_list<ValueType> a) {
    std::copy(begin(a), end(a), back_inserter(vec)); 
    return (*this);
}
int main() {
    container<int> M(5);
    M = { 1, 2, 3, 4, 5 };
    for (auto i : M.vec) std::cout << i << ' ';
}