2 votes

C++ comment obtenir le nom d'un argument passé à une fonction (un itérateur STL)

Avoir une fonction ci-dessous appelée relu():

void mModelRecorder::relu(Data::TensorIterator inputTensor){}

que j'appelle comme ceci:

rc.relu(conv);

À l'intérieur de relu, je veux obtenir le nom de l'argument inputTensor (sous forme de chaîne de caractères) qui a été passé en paramètre.

Dans ce cas, il s'agit de "conv".

Ma question est comment pourrais-je faire cela.

Je suis en train d'apprendre sur les modèles de fonctions et les itérateurs donc je ne comprends pas vraiment ce qu'est inputTensor.

Voici la définition de TensorIterator.

2voto

divinas Points 312

Ceci est impossible dans la version actuelle de la norme C++ (C++17). Il existe des propositions pour la Réflexion en C++20, mais je ne suis pas très familier avec elles, et je doute sérieusement que l'une d'entre elles couvre ce cas, car il semble très compliqué et inhabituel.

Si vous souhaitez transmettre des informations en fonction de l'endroit d'où vous passez l'objet, la bonne chose à faire serait de stocker ces informations supplémentaires à l'intérieur de l'objet lui-même.

2voto

user2079303 Points 4916

Vous pouvez passer le nom en tant qu'argument de chaîne :

void mModelRecorder::relu(Data::TensorIterator inputTensor, const char *name_of_arg);

rc.relu(conv, "conv");

Si vous souhaitez éviter de dupliquer le nom, vous pouvez utiliser une astuce avec des macros :

#define REFLECT_PASSED_ARG_NAME(arg) (arg), #arg

rc.relu(REFLECT_PASSED_ARG_NAME(conv));

Cependant, bien que cela supprime la duplication, cela réduit probablement la lisibilité. L'appel semble ne passer qu'un seul argument, alors qu'en réalité, la macro se développe en deux arguments. Cela peut être très déroutant.


De plus, je recommande de reconsidérer pourquoi vous aimeriez connaître le nom de la variable dans relu. Si le comportement de la fonction dépend de ce détail, vous devriez probablement revoir la conception.

Par exemple, si vous souhaitez simplement donner un nom à un itérateur de tenseurs, alors mélanger le nom de l'itérateur et le nom de la variable est une très mauvaise idée. Au lieu de cela, vous pourriez créer un objet, avec des membres name et iterator, et stocker le nom dans ce membre. Exemple :

struct named_tensor_iterator {
    std::string name;
    Data::TensorIterator iterator;
};

// passer par référence pour éviter de copier le nom
void mModelRecorder::relu(const named_tensor_iterator& inputTensor);

named_tensor_iterator input {
     "fancy iterator",
     conv,
};
rc.relu(input);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X