gpt4 book ai didi

c++ - Variadic 用户定义的转换/构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:39 26 4
gpt4 key购买 nike

给定以下使用 std::array 的 vector 类(用于 2d、3d 或 4d vector 数学),是否可以定义可变参数构造函数和/或转换构造函数?

作为后续问题,这种做法不好吗?我发现自己需要大量地相互转换整数、 float 和 double 。

我知道会发生隐式转换,但我的编译器会给我警告(我一般不想关闭它们)。

#include <array>

template<typename T0, size_t S>
class Vec
{
public:

static_assert(S > 1 && S < 5, "vector dimension must be between 2 and 4");
static_assert(std::is_arithmetic<T0>::value, "type must be arithmetic");

std::array<T0, S> v;

Vec() = default;

template<class T1, class T2>
Vec(T1 t1, T2 t2) : v({ static_cast<T0>(t1),
static_cast<T0>(t2) }) {}

template<class T1, class T2, class T3>
Vec(T1 t1, T2 t2, T3 t3) : v({ static_cast<T0>(t1),
static_cast<T0>(t2),
static_cast<T0>(t3) }) {}

template<class T1, class T2, class T3, class T4>
Vec(T1 t1, T2 t2, T3 t3, T4 t4) : v({ static_cast<T0>(t1),
static_cast<T0>(t2),
static_cast<T0>(t3),
static_cast<T0>(t4) }) {}
};

int main(void)
{
auto foo1 = Vec<float, 2>(1, 2);
auto foo2 = Vec<float, 2>(1.0f, 2.0f);
auto foo3 = Vec<float, 2>(1.0, 2.0);
auto foo4 = Vec<float, 2>(1u, 2u);

return 0;
}

最佳答案

当然可以。

顺便说一句,在这种情况下你不需要默认构造函数,因为这个可变参数构造函数在某种程度上更好,它会将你的数组归零...

template<typename T0, size_t S>
class Vec
{
public:

static_assert(S > 1 && S < 3, "vector dimension must be between 2 and 4");
static_assert(std::is_arithmetic<T0>::value, "type must be arithmetic");

std::array<T0, S> v;

template <typename ...T>
Vec(T&& ...a) : v{{ static_cast<T0>(std::forward<T>(a))...}}
{}
};

关于c++ - Variadic 用户定义的转换/构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575042/

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