gpt4 book ai didi

c++ - 重载类型转换为初始化列表

转载 作者:行者123 更新时间:2023-11-30 03:40:51 25 4
gpt4 key购买 nike

假设我正在开发一个类 Vec<T> , 它表示一个数学 vector ,其元素类型为 T .

为方便起见,我创建了采用 std::initializer_list 的构造函数:

Vec(std::initializer_list<T> l)
: size(l.size())
{
data = new T[size];
std::copy(l.begin(), l.end(), data);
}

所以现在我可以做以下事情:

v += Vec<int>({ 1, -1 });
bool equal = (v == Vec<int>({ 8, 9 }));

等等...不过,如果我能把它写得更短更简洁就好了:

v += { 1, -1 };
bool equal = v == { 8, 9 };

我如何实现这种行为?我想我可以将类型转换运算符重载为 std::initializer_list ,但它甚至被认为是正常做法吗?它对编译时间和性能有多糟糕,它还能工作吗?

std::vector呢? , 它是否支持 C++11 中的类似功能?

编辑:

所以,这是我的 operator+= :

Vec<T> & operator+=(const Vec<T> &v)
{
assert(size == v.size);
for (int i = 0; i < size; ++i)
data[i] += v.data[i];
return *this;
}

评论中的答案是正确的,initializer_list实际上在赋值运算符之后起作用:

v += {2, 3};
v -= {2, 3};

我想写这样的东西:

v = v + {2, 3};

这就是它不起作用的原因。

因此,结论是:您可以在赋值运算符和复合赋值运算符之后像这样使用它,但是对于二元算术运算符和比较运算符它不起作用,我说得对吗?我想创建自定义文字也不是一个选项。

顺便问一下:

const Vec<float> a{ 1.01, 2.02 };  // error: conversion from 'double' to 'float' requires a narrowing conversion    test_app
const Vec<float> b{ 1.01f, 2.02f }; // works, obviously

我可以做些什么来在第一种情况下启用隐式转换吗?

EDIT2

这是 operator+ :

friend Vec<T> operator+(Vec<T> v, const Vec<T> &w)
{
v += w; // reuse compound assignment
return v; // return the result by value (uses move constructor)
}

最佳答案

不幸的是,v + {1, 2} 在 C++ 中不是语法规则的格式正确的表达式。大多数二元运算符只对每个操作数采用表达式,而花括号列表不是表达式。复合赋值运算符 += 是特殊的,因为赋值还接受一个 initializer-clause 作为右手操作数,所以 v += {1, 2} 恰好有效。

一些备选方案:

operator+(v, {1, 2})
v + Vec<int>({1, 2})

关于c++ - 重载类型转换为初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37775045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com