#define函数,带有变量名

时间:2017-07-05 01:43:59

标签: c++ preprocessor-directive

我不断写一些类似于

的东西
std::vector< std::vector< double > > A(N, std::vector< double >(M));

我想用

之类的东西替换它
matrix A(N,M);

使用#define指令。我查看了#define directives并认为我可以创建一个像matrix(A,N,M)这样的函数来声明vector vectors,如下所示:

#define matrix(A, N, M) std::vector< std::vector< double > > A(N, std::vector< double >(M))

但我不想将我的矩阵声明为matrix(A,N,M),而是matrix A(N,M)。我的问题是 - 如何使用#define指令来考虑更改变量名称?

2 个答案:

答案 0 :(得分:1)

您可以使用typedef并定义类型,类似:

#include <vector>
using namespace std;

int main() 
{
    int N = 10;
    typedef std::vector< std::vector<double> matrix;
    matrix  A(N, std::vector< double >(N));
    return 0;

}

或更安全(如果您不知道,该矩阵将是正确的)

int main()
{
    int N = 10;

    typedef std::vector< std::array<double, 5> > matrix;
    matrix  A(N, std::array< double , 5 >());
    return 0;
}

我的带矢量矩阵的包装器

#include <iostream>
#include <vector>
#include <exception>
#include <algorithm>

template< typename T >
class WrapperMatrix
{
public:
    WrapperMatrix(const int& weight, const int& length);
    void pushLine(const std::vector<T>&&);
    void pushColumn(const std::vector<T>&&);
    void display();
private:
    std::vector<std::vector<T>> matrix;
};
template<typename T>
WrapperMatrix<T>::WrapperMatrix(const int& weight, const int& length) 
{
    this->matrix = std::vector<std::vector<T>>(weight, std::vector<T>(length));
}

template <typename T>
void WrapperMatrix<T>::pushLine(const std::vector<T>&& newLine)
{
    if (newLine.size() == this->matrix.at(0).size())
        matrix.emplace_back(std::move(newLine));
    else
        throw std::invalid_argument("Invalis syntax");
}
template <typename T>
void WrapperMatrix<T>::pushColumn(const std::vector<T>&& newColumn)
{
    if (newColumn.size() == this->matrix.size())
    {
        for (int i = 0; i < matrix.size(); ++i)
            matrix.at(i).emplace_back(std::move(newColumn.at(i)));
    }
    else
        throw std::invalid_argument("Invalid syntax");
}
template<typename T>
void WrapperMatrix<T>::display()
{
    for (int i = 0; i < matrix.size(); ++i)
    {
        for (int j = 0; j < matrix.at(0).size(); ++j)
            std::cout << matrix.at(i).at(j);
        std::cout << std::endl;
    }
}
int main()
{
    std::vector<int> v1{ 1,2,3,4,5 };
    std::vector<int> v2{ 1,2,3,4,5,6 };
    std::vector<int> v3{ 2,3,4,5,6 };

    WrapperMatrix<int> vw(5,5);
    try {
        vw.pushLine(std::move(v1));
        vw.pushColumn(std::move(v2));
        //vw.pushLine(std::move(v3));
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    vw.display();
    return 0;
}

答案 1 :(得分:0)

typedef

的替代答案

using matrix = std::vector< std::vector<double>>;

此表单更具可读性,尤其是函数和数组类型。例如。 using arr10 = Foo[10]typedef Foo arra10[10]更清晰。 =符号清楚地区分了所定义的内容及其定义方式。

(忽略整个&#34;矩阵不是向量的矢量&#34;讨论)