C++如何获取传递给函数(STL 迭代器)的参数的名称
C++ how to get the name of a argument passed to a function (an STL iterator)
下面有一个名为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
中的变量名称。如果函数的行为依赖于这些细节,你可能应该重新设计。
例如,如果你只是想给张量迭代器起一个名字,那么将迭代器的名称和变量的名称混为一谈是一个非常糟糕的主意。相反,您可以创建一个对象,其中包含成员name
和iterator
,并将名称存储在该成员中。例:
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);
相关文章:
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- "迭代器"和"const_iterator"不是 STL 容器的必需成员?
- 没有 STL 容器的迭代器
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 迭代器 STL C++是模板、类还是接口?
- 为什么我们不在 STL 的迭代器中传递星号(*)
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 迭代器和 STL 容器的关系
- C++ 中 STL 中迭代器的大小(以字节为单位)是多少
- 如何将 stl 迭代器与特征一起使用?
- 用于 STL 迭代器、指针和 std::nullptr_t 的模板函数
- 在 stl 容器包装器中定义迭代器类型
- 在多个 STL 对对象上创建迭代器
- 如何为获取 stl 容器迭代器的函数提供函数签名?
- 在 stl 算法中移动迭代器
- lower_bound 在 C++ STL 中返回迭代器,即使元素不存在也是如此.如何避免这种情况?
- 并行STL插入迭代器,例如std :: back_insert_iterator
- STL 迭代器继承:"value_type"不命名类型