如何使c++函数隐式地将整型数列表转换为矢量形参
How do I make a C++ function implicitly convert a list of ints into a vector parameter?
我正在研究一个库,其函数通常采用向量类型(__v4si
,或4个有符号整数的向量)作为参数。(注意到目前为止,这与 c++ STL vector
模板类无关;这是一个更基本的构造,用于让编译器生成向量化 SIMD代码。)
在我的C代码中,我通常调用包装器宏,该宏接受int参数列表并初始化__v4si
,如下所示:
#define MakeIndex(dims...) ((__v4si){ dims })
这当然在 c++ 中也工作得很好,但是我想利用 c++ 更具表现力的类型系统来清理对我的库api的调用。例如,我现在这样写:
long idx = IndexDotProduct(MakeIndex(1, 2, 3), MakeIndex(4, 5, 6, 7));
宏展开为:
long idx = IndexDotProduct(((__v4si){1, 2, 3}), ((__v4si){4, 5, 6, 7}));
我希望能够这样写:
long idx = IndexDotProduct({1, 2, 3}, {4, 5, 6, 7});
所以,本质上(我认为)我想定义一个类,它只是围绕原始__v4si
类型的语法糖,但它有一个隐式的列表初始化操作符。
如何在 c++ 11中做到这一点?
<标题> 解决方案下面是一个适用于C和 c++ 代码的公式(现在使用从我的库头文件中复制和粘贴的更详细的名称):
typedef struct vMAT_Index {
__v4si v;
#ifdef __cplusplus
vMAT_Index(__v4si v) : v(v) { }
vMAT_Index(int v0 = 0, int v1 = 0, int v2 = 0, int v3 = 0) : v((__v4si){ v0, v1, v2, v3 }) { }
#endif
} vMAT_Index;
#define vMAT_MakeIndex(dims...) ((vMAT_Index){ .v = { dims } })
static inline long
vMAT_Index_dot(vMAT_Index a,
vMAT_Index b)
{
__v4si c = a.v * b.v;
return (long)c[0] + c[1] + c[2] + c[3];
}
在C代码中,您仍然像这样使用helper宏:
long idx = vMAT_Index_dot(vMAT_MakeIndex(1, 2, 3), vMAT_MakeIndex(4, 5, 6, 7));
但是现在在 c++ 中你可以直接写:
long idx = vMAT_Index_dot({ 1, 2, 3 }, { 4, 5, 6, 7 });
感谢nosid提供必要的答案!
标题>使用隐式构造函数从大括号初始化列表自动创建vector对象:
struct vector
{
vector(__v4si v);
vector(int i0, int i1, int i2, int i3);
};
long IndexDotProduct(vector lhs, vector rhs);
long idx = IndexDotProduct(((__v4si){ 1, 2, 3 }), { 4, 5, 6, 7 });
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 无法从"初始值设定项列表"转换为模板<int>
- 将 lambda 函数转换为具有混合 lambda 引入器和参数列表的函子结构
- 传递可变参数时在成员初始值设定项列表中强制转换
- C++中有向无环图的邻接列表到邻接矩阵的转换
- C++列表初始化允许多个用户定义的转换
- 类型映射资源并将列表转换为矢量(并返回)
- 函数获取参数的变量列表并将它们转换为一系列字节?
- 从 std::vector<double> 到 Python 列表的转换失败(提升 python)
- 在初始值设定项列表中强制转换shared_ptr
- 将 std::list of structs 转换为 Python 列表
- 标准::列表转换和复制
- 如何在逗号分开列表中解析字段并将其转换为整数
- 错误 C2440:"正在初始化":无法从"初始值设定项列表"转换为"std::vector<char *,std::分配器<_Ty>>
- 如何将任何值转换为字节数组并将其附加到字节列表
- 解析SVG转换属性的转换列表
- 最好强制转换列表中的一个元素,或者使用指向它的指针