gpt4 book ai didi

c++ - 模板:如何使用模板变量控制构造函数参数的数量。

转载 作者:IT老高 更新时间:2023-10-28 22:08:25 24 4
gpt4 key购买 nike

我正在尝试以这种方式制作一个简单的 Vector 类(数学):

template <int D, typename T = float>
class Vector
{
T m[D];
// ...
};

其中D 是维数。如果是两个, vector 将存储两个 T 类型的值。


如何声明构造函数以获取 D 类型的 T 参数?

Vector<2> v(1.0f, -6.3f);

如何只在D如果是特定数字的情况下添加功能?如果 D 为 >= 1,我希望添加 GetX(),如果 D 为 >=,我希望添加 GetY() 2 和 GetZ() 如果 D >= 3,但以下代码应生成编译时错误:

Vector<2> v(1.0f, -6.3f);
cout << v.GetZ() << endl;

如果 D 为 < 1,如何生成编译时错误?

我没有遵循任何特定的标准,任何东西都适合我。

最佳答案

所以我提供了一些人们喜欢的愚蠢答案。但这比那要容易得多:)

template <int D, typename T = float>
class v {
public:
template <typename... Args>
v(Args... args) : a{ T(args)... } {
static_assert(sizeof...(Args) == D, "wrong number of arguments");
}

private:
T a[D];
};

您可以使用可变参数模板和 SFINAE 来获取具有正确数量参数的构造函数。

构造函数没有返回值,因此我们需要在其中一个参数上使用 SFINAE。并且要使用可变参数模板,我们需要在末尾有参数包。

这意味着我们需要在第一个参数上使用 SFINAE。

那么这意味着第一个参数之后的参数包需要比维度少一个参数。

有了这个,我们可以写:

template <int D, typename T>
class v {
public:
template <typename... Tail>
v(typename std::enable_if<sizeof...(Tail)+1 == D, T>::type head, Tail... tail)
: a{ head, T(tail)... } {}

private:
T a[D];
};

现在:

v<4, int> a(1,2,3,4); // ok!
v<4, int> b(1,2,3); // error! no such constructor

关于c++ - 模板:如何使用模板变量控制构造函数参数的数量。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8158261/

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