gpt4 book ai didi

c++ - 如果模板是整数类型,则仅对某些模板规范启用功能

转载 作者:行者123 更新时间:2023-12-02 18:51:15 25 4
gpt4 key购买 nike

我有一个 Vector 类,其模板为 <unsigned int Dim> ,例如。我可以Vector<2>对于二维空间中的 vector ,Vector<4>对于 4 维等。我想向类添加一些方法 if Dim == specific value ,例如CrossProduct对于 Vector<3> ,或x,y,z,w足够维数 vector 的 setter/getter 。如果与尺寸不正确的 vector 一起使用,我希望得到一个编译错误。

我环顾四周,我认为足够接近的事情之一是 std::enable_if但是,我不知道如何将它用于我的特定情况(其中条件是 Dim == xDim > x )。

这是正确的方法,还是我应该采用完全不同的方法?

顺便说一句,我正在使用 C++17。

最佳答案

  • C++20 之前的版本,static_assert 可能是最简单的:

    template <std::size_t Dims>
    struct Vector
    {
    // ...
    double getZ() const { static_assert(Dims >= 3); return data[2]; }
    };
  • SFINAE 是可能的,但复杂且冗长:

    template <std::size_t Dims>
    struct Vector
    {
    // ...
    template <std::size_t D = Dims, std::enable_if_t<(D >= 3) && D == Dims, int> = 0>
    double getZ() const { return data[2]; }
    };
  • 特化是可能的,但可能会很棘手,例如:

    struct NullVector3{};

    template <typename Derived>
    struct Vector3
    {
    // ...
    double getZ() const { return static_cast<Derived*>(this)->data[2]; }
    };

    template <std::size_t Dims>
    struct Vector : std::conditional_t<(Dims >= 3), Vector3<Vector<Dims>>, NullVector3> /*, ..*/
    {
    // ...
    // inherit of Vector3<Vector>::getZ() when Dims >= 3
    // inherit of no extra method from NullVector3 else.
    };
  • C++20 是最简单的,requires:

    template <std::size_t Dims>
    struct Vector
    {
    // ...
    double getZ() const requires(Dims >= 3) { return data[2]; }
    };

关于c++ - 如果模板是整数类型,则仅对某些模板规范启用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66748590/

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