gpt4 book ai didi

c++ - 有没有为特定模板值添加成员变量的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:05 25 4
gpt4 key购买 nike

我有这个数学 vector 结构:

template <size_t _Size, typename _NumType>
struct Vector {
_NumType elements[_Size];

//... Other stuff ...
};

我想根据 vector 中元素的数量添加变量。像这样:

_NumType& x = elements[0]; // Only if _Size >= 1
_NumType& y = elements[1]; // Only if _Size >= 2
_NumType& z = elements[2]; // Only if _Size >= 3

创建一个基类/结构然后扩展将是一个解决方案,但由于其他代码我不能这样做(它只会产生更多问题)。

我发现的另一个解决方案是做一些我认为称为部分模板特化的事情:

template <typename _NumType>
struct Vector<2U, _NumType> {
_NumType& x = elements[0];
_NumType& y = elements[1];

//... Other stuff ...
};

此解决方案的问题是我必须为每个特化复制“其他内容”,这是我宁愿避免的(“其他内容”大约有 70 行代码)。

如果没有解决方案,我可以详细说明扩展基类的问题,但我希望这不是必需的。

最佳答案

部分模板特化可以完成这项工作,并且为了避免代码重复你必须拆分类,比如

template <size_t Size, typename T>
struct VectorData {
T elements[Size];
};

template <typename T>
struct VectorData<2, T> {
T elements[2];
T& x = elements[0];
T& y = elements[1];
};

template <typename T>
struct VectorData<3, T> {
T elements[3];
T& x = elements[0];
T& y = elements[1];
T& z = elements[2];
};

template <size_t Size, typename T>
struct Vector : VectorData<Size, T> {
//... Other stuff ...
};

如果您更改对函数的引用,您可能会使用 SFINAE,并且从 C++20 开始,您甚至可能会放弃一些方法:

template <size_t Size, typename T>
struct Vector : VectorData<Size, T> {
T elements[Size];

T& x() requires (size == 2 || size == 3) { return elements[0]; }
T& y() requires (size == 2 || size == 3) { return elements[0]; }
T& z() requires (size == 3) { return elements[0]; }
//... Other stuff ...
};

关于c++ - 有没有为特定模板值添加成员变量的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57342346/

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