模数与数值参数化集的构造函数参数

时间:2011-08-05 22:22:41

标签: c++ templates

我对c ++模板比较陌生,并且正在实现一些数值例程。特别是,我一直在查看一些代码,其风格如此,如果要定义一个向量,它将是

template <class Field>
class Vector2
{
    private:
    std::vector<Field> container;

    public:
    Vector2(size_t size) : container(std::vector<Field>(size, Field(0))) {}
    Vector2(const Vector2<Field> &source) : container(source.container) {}

          Field & operator[](size_t index) { return container.at(index); }
    const Field & operator[](size_t index) const { return container.at(index); }

    Vector2<Field> operator+( const Vector2<Field> & rhs) const {
        if (rhs.container.size() != container.size())
            throw new std::invalid_argument("wrong size");

        Vector2<Field> sum(*this);
        for (int i = 0; i < container.size(); i++)
            sum[i] += rhs[i];
        return sum;
    }
};

但是,如果我正在设计类模板,我会选择在模板参数中指定大小:

template <int size, class Field>
class Vector1
{
    private:
    std::vector<Field> container;

    public:
    Vector1() : container(std::vector<Field>(size, Field(0))) {}
    Vector1(const Vector1<size, Field> &source) : container(source.container) {}

    Field & operator[](size_t index) { return container.at(index); }
    const Field & operator[](size_t index) const { return container.at(index); }

    Vector1<size, Field> operator+( const Vector1<size, Field> & rhs) const {
        Vector1<size, Field> sum;
        for (int i = 0; i < size; i++)
            sum[i] += rhs[i];
        return sum;
    }
};

我的想法是,这会阻止添加两个不同维度的向量之类的东西,因为它们会是不同的类。特别是像

这样的东西
Vector1<double> a (3);
Vector1<double> b (4);
Vector1<double> c = a + b;

需要运行时检查大小,但

Vector2<3,double> a;
Vector2<4,double> b;
Vector2<5,double> c = a + b;

甚至不会编译。由于此代码是数值分析包的一部分,执行速度至关重要,我必须假设作者会考虑这样的事情。这种样式在整个代码中用于向量,矩阵和其他对象,这些对象将被解释为数值参数化集合的元素(即不同维度的向量空间)。

所以,我的问题是,

  
    

是否有任何执行速度注意事项意味着建构者参数方法与模板参数方法的偏好?

  

2 个答案:

答案 0 :(得分:3)

当然。如果向量大小是运行时参数,则二进制操作必须在运行时检查操作数大小是否一致。

理想情况下,C ++数字包应该提供具有运行时指定大小和编译时指定大小的模板,它们应该是可互换的。在编译时指定大小只能提高性能。

您可以使用std::vector / std::array替换给定实施中的boost::array来实施您的建议。如果模板参数仅用于定义运行时参数,则不会获取任何内容。

答案 1 :(得分:2)

  

即。不同维度的向量空间

如果在编译时未知维度,则它不能是模板参数。周期。

模板在编译时更强大,但在运行时会有一些灵活性。