C++如何获取传递给函数(STL 迭代器)的参数的名称

C++ how to get the name of a argument passed to a function (an STL iterator)

本文关键字:迭代器 STL 参数 函数 何获取 获取 C++      更新时间:2023-10-16

下面有一个名为relu()的函数:

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

我这样称呼:

rc.relu(conv);

在 relu 内部,我想获取传入的参数 inputTensor 的名称(作为字符串(。

在这种情况下,它是"conv"。

我的问题是我怎么能做到这一点。

我只是在学习函数模板和迭代器,所以我真的不明白inputTensor是什么。

这是TensorIterator的定义。

在当前版本的C++标准(C++17(下,这是不可能的。在C++20中有一些关于反思的建议,但我对它们不是很熟悉,老实说,我严重怀疑它们中的任何一个都会涵盖这种情况,因为它看起来非常复杂和不寻常。

如果要根据传递对象的位置传递某种信息,正确的做法是将这些附加信息存储在对象本身中。

您可以将名称作为字符串参数传递:

void mModelRecorder::relu(Data::TensorIterator inputTensor, const char *name_of_arg);
rc.relu(conv, "conv");

如果你想避免重复的名字,你可以使用宏技巧:

#define REFLECT_PASSED_ARG_NAME(arg) (arg), #arg
rc.relu(REFLECT_PASSED_ARG_NAME(conv));

然而,虽然这消除了重复,但它可以降低可读性。调用看起来只传递了一个参数,而实际上,宏扩展为两个参数。这可能会非常令人困惑。


此外,我建议您重新考虑为什么您想知道relu中的变量名称。如果函数的行为依赖于这些细节,你可能应该重新设计。

例如,如果你只是想给张量迭代器起一个名字,那么将迭代器的名称和变量的名称混为一谈是一个非常糟糕的主意。相反,您可以创建一个对象,其中包含成员nameiterator,并将名称存储在该成员中。例:

struct named_tensor_iterator {
    std::string name;
    Data::TensorIterator iterator;
};
// pass by reference to avoid copying the name
void mModelRecorder::relu(const named_tensor_iterator& inputTensor);
named_tensor_iterator input {
     "fancy iterator",
     conv,
};
rc.relu(input);