C++ 构造函数委托前的错误检查

C++ Error checking before constructor delegation

我有一个从 size_t 维度创建矩阵的构造函数,我想添加对 int 维度的支持。但是,在将整数传递给 size_t 构造函数之前,我想确保它们是正数。

 Matrix(vector<double> vals, int rows, int cols ) 
 \throw something if rows<= 0 || cols<= 0
:Matrix(vals,static_cast<size_t>(rows), static_cast<size_t>(cols))

这样的事情可能吗?

通过函数传递它们,

int enforce_positive(int x) 
{ 
    if (x <= 0) { 
        throw something; 
    } 
    return x; 
}

Matrix(vector<double> vals, int rows, int cols ) 
  : Matrix(vals,
           static_cast<size_t>(enforce_positive(rows)), 
           static_cast<size_t>(enforce_positive(cols)))

当然,您可以将其设为模板。

您还可以使用“证明类型”并在原型中明确说明条件。像

temolate<typename T>
class Positive
{
public:
    explicit Positive(T x): val(x)
    {
        if (val <= 0) {
            throw something;
        }
    }
    operator T() const { return val; }
private:
    T val;
};

Matrix(const vector<double>& vals,
       Positive<int> rows,
       Positive<int> cols ) 
  : Matrix(vals,
           static_cast<size_t>(rows), 
           static_cast<size_t>(cols))

//...
int x = ...;
int y = ...;
Matrix m(stuff, Positive(x), Positive(y));