您好我遇到了这篇
code.它演示了如何使用dlib库的矩阵结构.
根据这个,可以通过以下方式初始化矩阵结构:
M = 54.2,7.4,12.1,1,2,3,5.9,0.05,1;
怎么可能在C?
这是某种运算符重载吗?
解决方法
逻辑
这可以通过重载operator(运算符逗号)来实现,例如使它将新的浮点值推入M.
需要注意的是,运算符应始终至少有一个类类型的参数,因此您必须创建一个可隐式转换为浮点值的类(例如,通过非显式构造函数,其中1个参数类型为double或漂浮).
例
例如,我们将尝试在std :: vector上为包装器类型执行此操作,并且我们将尝试使M = 1,4,5成为有效表达式,从而生成带有这些的std :: vector元素按顺序排列.您会看到这很容易适用于您提供的矩阵示例.
要记住的是,operator =比operator更具优先权(如this table of operator precedence所示);因此,M = 1,5将真正解析为:(((((M = 1),2),3),4),5).
鉴于此,我们将首先创建一个带有operator =的class容器,它接受一个值并将其推送到容器中:
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; };
此时我们可以定义运算符,如:
template<typename ValueType> container<ValueType>& operator,(container<ValueType>& m,ValueType a) { m.vec.push_back(a); return m; }
它只是推回一个新的元素值.
现在你可以很容易地看到以下工作正常并打印1 2 3 4 5:
int main() { container<int> M(5); M = 1,5; for (auto i : M.vec) std::cout << i << ' '; }
注意事项
我尽可能地劝阻这种技术.它迫使你为其他运算符设置奇怪的语义,例如operator =,并且似乎没有添加任何简单使用std :: initializer_list< T>.
一个更好的例子是operator =如下:
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,5 }; for (auto i : M.vec) std::cout << i << ' '; }