在编译时设置 Vector 的值
Set Values of Vector at compile-time
我为教育实现了自己的向量 class。这是一个简化的片段:
template <size_t DIM>
class Vector
{
private:
float _data[DIM];
public:
void Set();
float Length() const;
float& operator[](size_t index);
}
我成功实现了Length()
和operator[]
方法,我现在的问题是如何实现Set()
方法,它需要带DIM
个参数,而不是更多而不是更少,应该填充向量。
我已经通过以下调整解决了这个问题:
void Set(const std::array<float, DIM>& input)
{
std::copy(input.begin(), input.end(), _data);
}
这种方法的问题是我必须按如下方式使用 Set()
方法:
object.Set({1,2,3})
而不是如下 object.Set(1,2,3)
并且编译器仅在 {}
中的参数数量大于 DIM
且不小于
时才会抱怨
我还使用了第二个 hack 解决了这个问题,但创建了另一个 :
size_t index = 0;
template <typename FIRST>
void Set(FIRST first)
{
_data[index] = first;
index = 0;
}
template <typename FIRST, typename ... SECOND>
void Set(FIRST first, SECOND... second)
{
_data[index] = first;
++index;
Set2(second...);
}
现在我可以使用object.Set(1,2,3)
然而,这可能需要少于或多于 DIM
个参数,因此不是一个好的选择。我知道我可以通过在 运行 时检查来解决这个问题,但我希望编译器在编译时没有完全 DIM 参数时抱怨。
关于如何改进我的解决方案的一些提示我会很高兴 :)
您可以简单地使用 static_assert
:
template <size_t DIM>
class Vector
{
private:
std::array<float, DIM> data_;
public:
// Other stuff
template <typename... Args>
void Set(Args... args)
{
static_assert(sizeof...(args) == DIM,
"Wrong number of args");
data_ = {args...};
}
};
如果提供了错误数量的元素,那么静态断言将在编译时提供一个很好的错误,准确说明出了什么问题。
我为教育实现了自己的向量 class。这是一个简化的片段:
template <size_t DIM>
class Vector
{
private:
float _data[DIM];
public:
void Set();
float Length() const;
float& operator[](size_t index);
}
我成功实现了Length()
和operator[]
方法,我现在的问题是如何实现Set()
方法,它需要带DIM
个参数,而不是更多而不是更少,应该填充向量。
我已经通过以下调整解决了这个问题:
void Set(const std::array<float, DIM>& input)
{
std::copy(input.begin(), input.end(), _data);
}
这种方法的问题是我必须按如下方式使用 Set()
方法:
object.Set({1,2,3})
而不是如下 object.Set(1,2,3)
并且编译器仅在 {}
中的参数数量大于 DIM
且不小于
我还使用了第二个 hack 解决了这个问题,但创建了另一个 :
size_t index = 0;
template <typename FIRST>
void Set(FIRST first)
{
_data[index] = first;
index = 0;
}
template <typename FIRST, typename ... SECOND>
void Set(FIRST first, SECOND... second)
{
_data[index] = first;
++index;
Set2(second...);
}
现在我可以使用object.Set(1,2,3)
然而,这可能需要少于或多于 DIM
个参数,因此不是一个好的选择。我知道我可以通过在 运行 时检查来解决这个问题,但我希望编译器在编译时没有完全 DIM 参数时抱怨。
关于如何改进我的解决方案的一些提示我会很高兴 :)
您可以简单地使用 static_assert
:
template <size_t DIM>
class Vector
{
private:
std::array<float, DIM> data_;
public:
// Other stuff
template <typename... Args>
void Set(Args... args)
{
static_assert(sizeof...(args) == DIM,
"Wrong number of args");
data_ = {args...};
}
};
如果提供了错误数量的元素,那么静态断言将在编译时提供一个很好的错误,准确说明出了什么问题。