我想打印:table_name[variable_value]
通过提供一个输入:table_name[variable_name]
让我用基于宏的玩具解决方案解释一个更简单的案例:
int i = 1771;
我可以使用
打印variable_name
#define toy_solution(x) cout << #x ;
如果我执行
toy_solution(i);
“我”将被打印。
现在,假设有一个分配良好的表T
。
我想写一下程序:
solution(T[i]);
并在屏幕上阅读"T[1771]"
。
理想的解决方案是对待这两种情况,即:
ideal_solution(i)
会打印i
。
ideal_solution(T[i])
会打印T[1771]
。
使用宏或函数对我来说并不重要。
感谢您的帮助。
答案 0 :(得分:5)
#define toy_solution(x, i) cout << #x << "[" << i << "]"
答案 1 :(得分:4)
嗯,因为你不理解我的评论,我会在答案中大声说出来:我想打印:
table_name[variable_value]
通过提供一个输入:
table_name[variable_name]
我认为@lizusek的解决方案更好,因为你正在编写C ++代码,所以如果你能做的事情与使用宏的结果相同,你应该使用普通的C ++代码。
编辑:让我尝试解释为什么这是不可能的
所以你想要的是:
f(T[i]) -> T, i
你可以编写的唯一方法是在预处理器中有意义:
#define f(T[i]) cout<<#T#<<#i#
但是预处理器会给出错误,因为你不能将数组索引为函数(甚至是宏函数)参数:
test.c:5:12: error: expected comma in macro parameter list
#define f(T[i]) cout<<#T#<<#i#
^
如果你尝试使用C ++函数做同样的事情,那么它就更无意义了,因为函数调用如:
toy_solution(t[i]);
实际上会在运行时转换为值t[i]
,因此在函数内部,您永远无法知道给定值实际上是在数组中。所以你想要的是错的,你应该坚持良好的编码实践:使用一个函数,如果你想要的是:
toy_solution(t[i]);
然后使用:
toy_solution("t", i);
您可以使用自己的模板系统编写代码,也可以使用通常用于HTML处理的代码来处理源代码并应用转换规则,例如:
toy_solution(t[i]) -> toy_solution("t", t[i])
这绝对是可能的,但它会使您的构建链更加复杂并依赖于更多工具。 C / C ++构建工具链很复杂,请不要让它变得更糟。
或者您编写自己的C和C编译器的代码来更改语法规则,以便您可以实现所需。虽然,我个人永远不会使用你的叉子,然后我会在HN上对此进行控制和燃烧,深感遗憾的是给了你这么糟糕的主意: - )
如果您执行以下操作:
template<T>
class Element {
T value;
List<T> _owner;
[…]
}
template<T>
class List {
Element<T> values[];
std::string _name;
[…]
}
这样当你调用函数
时toy_solution(T[i]);
实现如下:
void toy_solution(Element<T> e) {
std::cout<<e.get_list_name()<<" "<<e.get_value()<<std::endl;
}
但是这样做太多样板和开销只是为了避免做一个看起来不像你梦想的那样简单的函数定义,我觉得这样做真是愚蠢。
答案 2 :(得分:2)
您可以编写一个简单的函数:
void solution( std::string const& t, int i) {
std::cout << t << "[" << i << "]";
}
用法:
int i = 1771;
solution( "T", i);
您也可以编写宏,但要注意这不是类型安全的。功能应该是首选。