我们假设我有一个这样的结构:
struct my_struct
{
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数应该为"a"或"b"设置一个新值.此函数还需要指定要设置的变量.一个典型的例子是这样的:
void f(int which, my_struct* s, int new_value)
{
if(which == 0)
s->a = new_value;
else
s->b = new_value;
}
Run Code Online (Sandbox Code Playgroud)
由于我不会在这里写的原因,我无法将指针传递给a/b到f.所以我不能用my_struct :: a或my_struct :: b的地址调用f.我不能做的另一件事是在my_struct中声明一个向量(int vars [2])并将一个整数作为索引传递给f.基本上在f中我需要按名称访问变量.
以前的例子的问题是,在将来我计划向struct添加更多变量,在这种情况下,我将记得向f添加更多if语句,这对于可移植性是不利的.我能做的就是将f写为宏,如下所示:
#define FUNC(which)
void f(my_struct* s, int new_value) \
{ \
s->which = new_value; \
}
Run Code Online (Sandbox Code Playgroud)
然后我可以调用FUNC(a)或FUNC(b).
这可行,但我不喜欢使用宏.所以我的问题是:有没有办法使用模板而不是宏来实现相同的目标?
编辑:我将尝试解释为什么我不能使用指针,我需要按名称访问变量.基本上,结构包含系统的状态.该系统需要在请求时"撤消"其状态.使用名为undo_token的接口处理撤消,如下所示:
class undo_token
{
public:
void undo(my_struct* s) = 0;
};
Run Code Online (Sandbox Code Playgroud)
因此,由于多态性,我无法将指针传递给undo方法(mystruct也包含其他类型的变量).
当我向结构中添加一个新变量时,我通常还会添加一个新类,如下所示:
class undo_a : public undo_token
{
int new_value;
public:
undo_a(int new_value) { …Run Code Online (Sandbox Code Playgroud) 这有效:
#include <iostream>
using namespace std;
Run Code Online (Sandbox Code Playgroud)
但这失败了:
#include <stdio>
Run Code Online (Sandbox Code Playgroud)
什么时候.h不需要?
关于命名空间问题,我没有找到这样的逻辑cstdio:
#pragma once
#ifndef _CSTDIO_
#define _CSTDIO_
#include <yvals.h>
#ifdef _STD_USING
#undef _STD_USING
#include <stdio.h>
#define _STD_USING
#else /* _STD_USING */
#include <stdio.h>
#endif /* _STD_USING */
// undef common macro overrides
#undef clearerr
#undef feof
#undef ferror
#undef getc
#undef getchar
#undef putc
#undef putchar
#define _HAS_CONVENTIONAL_CLIB 1
#define _IOBASE _base
#define _IOPTR _ptr
#define _IOCNT _cnt
#ifndef _FPOSOFF
#define _FPOSOFF(fp) ((long)(fp))
#endif /* _FPOSOFF …Run Code Online (Sandbox Code Playgroud)