Шаблон C ++: шаблон для вызова переменных по имени

Этот вопрос является продолжением предыдущего, найденного по адресу: Как шаблонизировать переменные NAMES, а не типы?

Допустим, у кого-то есть следующий код:

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 );
};

Я попробовал несколько идей, но ошибки запускают гадость. Я думаю, что проблемы связаны с тем, что я использую общий указатель наддува и / или 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
};

2

Решение

Следующее делает то, что вы хотите:

#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 );
}

Хотя я не понимаю, что вы подразумеваете под «шаблоном для вызова переменных по имени». Кстати, нет никаких причин, чтобы пройти i а также P по ссылке, и вы не должны делать это.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]