我有一个类,它有一些大字段(比如一些大矩阵),并且有成员函数来计算这些矩阵(当然,矩阵的实际数量更大)
class MyClass {
protected:
MatrixType m_11, m_12;
public:
void compute_m_11(double x);
void compute_m_12(double x);
}
现在,计算代码非常相似,最复杂的部分是矩阵元素的正确索引(对于所涉及的所有矩阵都是相同的)。所以我在考虑将索引和计算分成单独的函数:compute_matrix
函数,它将执行索引并为矩阵中的每组索引调用compute_element
函数。这将极大地提高代码的可读性并简化调试。
因此compute_matrix
函数会对我需要填写的类字段MatrixType
和std::function
进行实际计算。我显然想避免编写任何涉及额外复制矩阵的内容,因为它们可能非常大。
所以,问题是:
std::bind
来传递计算成员函数? compute_elements
函数需要访问MyClass
。这就是我的想法:
class MyClass {
protected:
MatrixType m_11, m_12;
double compute_elements_m11(int i, int j, double x);
double compute_elements_m12(int i, int j, double x);
void compute_matrix(MatrixType &m, double x, std::function<double(int, int, double) > f);
public:
void compute_m_11(double x) {compute_matrix(m_11, x, compute_elements_m11);};
void compute_m_12(double x) {compute_matrix(m_12, x, compute_elements_m12);};
}
答案 0 :(得分:3)
传递成员引用是合法的(并非罕见),但您的函数类型是错误的
您可以使用std::bind
,也可以使用普通指针指向成员:
class MyClass {
protected:
MatrixType m_11, m_12;
double compute_elements_m11(int i, int j, double x);
double compute_elements_m12(int i, int j, double x);
void compute_matrix(MatrixType &m, double x, double (MyClass::*f) (int, int, double);
public:
void compute_m_11(double x) {compute_matrix(m_11, x, &MyClass::compute_elements_m11);};
void compute_m_12(double x) {compute_matrix(m_12, x, &MyClass::compute_elements_m12);};
};
std::bind
和std::function
提供了更灵活的实施方式。
答案 1 :(得分:0)
当然,将类属性传递给内部成员函数并且您也可以使用std:bind
来调用成员函数并不罕见,但问题是您真的需要它还是只能使用简单的“如果“或类似的东西决定使用什么?我会说这取决于你的代码路径有多少选择来决定更好。
答案 2 :(得分:-1)
为什么要将类字段的引用传递给类成员函数?更好的解决方案是实现get方法并在compute_matrix
函数中使用它。你的课将看起来像这样:
class MyClass {
protected:
MatrixType m_11, m_12;
double compute_elements_m11(int i, int j, double x);
double compute_elements_m12(int i, int j, double x);
void compute_matrix(double x, std::function<double(int, int, double) > f);
public:
void compute_m_11(double x) {compute_matrix(x, compute_elements_m11);};
void compute_m_12(double x) {compute_matrix(x, compute_elements_m12);};
MatrixType& getMatrixType_11( return m_11 );
MatrixType& getMatrixType_12( return m_12 );
}