小编Sir*_*hot的帖子

C++ 17限制用于初始化模板类的fold表达式

我基本上尝试编写自己的游戏引擎用于练习和个人使用(我知道,这是一项几乎不可能完成的任务,但正如我所说,它主要用于学习新事物).

目前,我正在研究我的数学库(主要是矢量和矩阵),我遇到了一个有趣的,但主要是美学问题.

给出以下伪代码:

template <uint8 size>
struct TVector {
    float elements[size];
};
Run Code Online (Sandbox Code Playgroud)

现在我希望能够构造具有所需浮动量作为参数的结构:

TVector<3> vec0(1.0f, 2.5f, -4.0f); 
TVector<2> vec1(3.0f, -2.0f);

TVector<3> vec2(2.0f, 2.2f); // Error: arg missing 
TVector<2> vec3(1.0f, 2.0f, 3.0f) // Error: too many args
Run Code Online (Sandbox Code Playgroud)

由于数组的大小是由模板参数给出的,所以我很难为结构声明一个合适的构造函数.我的最终目标是这样的:

// This is pseudo-ideal-code
TVector(size * (float value)); // Create a constructor with number of size 
                               // parameters, which are all floats
Run Code Online (Sandbox Code Playgroud)

当然,这是非逻辑语法,但我以这种方式最接近的是用C++ 17倍表达式:

template<typename... Args>
    TVector(Args... values) {
        static_assert(sizeof...(values) <= size, "Too many args");
        uint8 i = 0;
        (... , …
Run Code Online (Sandbox Code Playgroud)

c++ constructor aggregate-initialization variadic-templates fold-expression

6
推荐指数
1
解决办法
729
查看次数

根据模板参数条件C++ 17创建成员别名

所以,我正在尝试简化我的泛型类的使用,并遇到了以下想法:

给出以下结构:

template <size_t size>
struct Vector {
    std::array<float, size> data;

    float& x = data[0];
    float& y = data[1]; // Declare y only if size is > 0
    float& z = data[2]; // Declare z only if size is > 1
    float& w = data[3]; // Declare w only if size is > 2
};
Run Code Online (Sandbox Code Playgroud)

显然,如果我尝试像这样运行程序,数组将抛出超出范围的异常.

现在有没有办法只在条件(编译时已知)给出时声明这些别名?

我想到了std :: enable_if的方式:

template <size_t size>
struct Vector {
    std::array<float, size> data;

    float& x = data[0];
    declare_if<(size > 0), float&> y = data[1]; …
Run Code Online (Sandbox Code Playgroud)

c++ variables alias templates metaprogramming

2
推荐指数
1
解决办法
121
查看次数

在一种情况下,将模板类专门用作浮点运算

所以,想象一个矢量类:

template <size_t size>
class Vector<size> {
    std::array<float, size> data;
    .... 
}
Run Code Online (Sandbox Code Playgroud)

如果大小为1,有没有办法将模板专门化为浮点数?就像是:

// The case of a Vector with size 1 should behave like a float
template <>
using class Vector<1> = float; 
Run Code Online (Sandbox Code Playgroud)

我也希望将其应用于其他课程.例如,将列大小为1的Matrix处理为具有行大小的Vector.


在此先感谢您的帮助 :)

c++ alias templates template-specialization

1
推荐指数
1
解决办法
69
查看次数