c – templates:如何使用模板变量控制构造函数args的数量。 - 代码日志

c – templates:如何使用模板变量控制构造函数args的数量。

我试图用一种简单的Vector类(数学)这样做:

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

其中D是维数。如果为2,则向量将存储两个类型T的值。

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

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

如何才能添加一个功能,如果D如果具体数字?如果D为> = 2,并且GetZ()如果D为> = 3,则我希望添加GetX(),如果D为> = 1,GetY(),则下列代码应生成编译时错误:

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

如果D为< 1? 我没有遵循任何具体的标准,任何事情都适用于我。

我没有访问C 11编译器,但也许这样可以工作?

#include <array>
#include <type_traits>

template <int D, typename T>
class Vector
{
    static_assert(D > 0, "Dimension must be greater than 0");
    std::array<T,D> m;
public:
    template<typename... Args>
    Vector(Args&&... args) : m{T(args)...}
    {
         static_assert(sizeof...(Args) == D, "Invalid number of constructor arguments.");
    }

    T GetX() const { return m[0]; }
    T GetY() const { return m[1]; }
    T GetZ() const { return m[2]; }
};

template <typename T>
class Vector<1, T>
{
    std::array<T,1> m;
public:
    Vector(const T& t0) : m{t0}
    {
    }

    T GetX() const { return m[0]; }
};

template <typename T>
class Vector<2, T>
{
    std::array<T,2> m;
public:
    Vector(const T& t0, const T& t1) : m{t0, t1}
    {
    }

    T GetX() const { return m[0]; }
    T GetY() const { return m[1]; }
};
http://stackoverflow.com/questions/8158261/templates-how-to-control-number-of-constructor-args-using-template-variable

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – templates:如何使用模板变量控制构造函数args的数量。