此问题是早期版本的延续:How to template'ize variable NAMES, not types?
假设有一个代码如下:
struct VAR_TYPE{
public:
bool is_fixed;
double value; // Numerical value
std::string name; // Description of variable (to identify it by name)
int reference_counter;
/* ect. */
};
struct NODE{
public:
VAR_TYPE X, Y, Z;
/* ect. */
};
class MyClass{
public:
std::vector <NODE_ptr> node; // shared ptr, using boost::shared_ptr
// what I have now
void set_variable_X(int &i, double &P) { node[i]->X.value = P; }
void set_variable_Y(int &i, double &P) { node[i]->Y.value = P; }
void set_variable_Z(int &i, double &P) { node[i]->Z.value = P; }
// What I want to replace all 3 members with:
<class T, class N>
void set_variable( int &i, double &P, /* ??? */ ) { /* ??? */ }
/* ect. */
};
我不确定在'???'的区域会发生什么是写的。借用上述链接中使用的伪代码,我想对
的影响有所帮助main(){
MyClass S;
double x1, y1, z1;
int index;
// set x1, y1, z1, index
S.set_variable( index, x1, &MyClass::node::X ); // in essence, what I want
S.set_variable( index, y1, &MyClass::node::Y );
S.set_variable( index, z1, &MyClass::node::Z );
};
我尝试了一些想法,但错误很糟糕。我认为问题在于我正在使用boost共享指针和/或std :: vector。任何人都知道问题和合适的解决方案是什么?我一直在使用的一个选项是(但它不使用我在上面的int main()中确定的调用约定):
template < class T, class N >
void MyClass::set_reference( int &i, double &P,
T NODE::* MemPtr,
N VAR_TYPE::* ValPtr)
{
*MemPtr[i].*ValPtr.value = P; // doesn't work work
};
答案 0 :(得分:1)
以下是你想要的:
#include <string>
#include <vector>
struct VAR_TYPE{
public:
bool is_fixed;
double value; // Numerical value
std::string name; // Description of variable (to identify it by name)
int reference_counter;
/* ect. */
};
struct NODE{
public:
VAR_TYPE X, Y, Z;
/* ect. */
};
class MyClass{
public:
std::vector <NODE *> node; // shared ptr, using boost::shared_ptr
// what I have now
void set_variable_X(int &i, double &P) { node[i]->X.value = P; }
void set_variable_Y(int &i, double &P) { node[i]->Y.value = P; }
void set_variable_Z(int &i, double &P) { node[i]->Z.value = P; }
// What I want to replace all 3 members with:
void set_variable( int &i, double &P, VAR_TYPE NODE::* ptr ) { (node[i]->*ptr).value = P;}
/* ect. */
};
main(){
MyClass S;
double x1, y1, z1;
int index;
// set x1, y1, z1, index
S.set_variable( index, x1, &NODE::X ); // in essence, what I want
S.set_variable( index, y1, &NODE::Y );
S.set_variable( index, z1, &NODE::Z );
}
虽然我不明白你的意思是“按名称调用变量的模板”。 BTW没有理由通过引用传递i
和P
,你不应该这样做。