【发布时间】:2009-03-23 10:20:37
【问题描述】:
假设我有一个这样的结构:
struct my_struct
{
int a;
int b;
}
我有一个函数应该为“a”或“b”设置一个新值。此功能还需要指定要设置的变量。一个典型的例子是这样的:
void f(int which, my_struct* s, int new_value)
{
if(which == 0)
s->a = new_value;
else
s->b = new_value;
}
由于我不会在这里写的原因,我不能将指向 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; \
}
然后我可以调用 FUNC(a) 或 FUNC(b)。
这可行,但我不喜欢使用宏。 所以我的问题是:有没有办法使用模板而不是宏来实现相同的目标?
编辑:我将尝试解释为什么我不能使用指针并且我需要按名称访问变量。 基本上,结构包含系统的状态。该系统需要在请求时“撤消”其状态。撤消是使用一个名为 undo_token 的接口来处理的,如下所示:
class undo_token
{
public:
void undo(my_struct* s) = 0;
};
因此,由于多态性,我无法将指针传递给 undo 方法(mystruct 也包含其他类型的变量)。
当我向结构中添加一个新变量时,我通常也会添加一个新类,如下所示:
class undo_a : public undo_token
{
int new_value;
public:
undo_a(int new_value) { this->new_value = new_value; }
void undo(my_struct *s) { s->a = new_value}
};
问题是我在创建令牌时不知道指向 s 的指针,因此我无法在构造函数中保存指向 s::a 的指针(这本来可以解决问题)。 “b”的类是一样的,只是我必须写“s->b”而不是s->a
也许这是一个设计问题:我需要每个变量类型一个撤消标记,而不是每个变量一个...
【问题讨论】:
-
FUNC(a) - 将定义 f(s, new_value)。但是那你怎么称呼它呢?
-
是的,抱歉,这是一个错误。但我还是希望你明白这一点:)
-
即使在您编辑之后,使用我的答案和 Mykola Golubyev 的答案,您仍然可以使用指向类数据成员的指针参数化您的撤消类,并在成员调用时将其绑定到类/结构。
-
我已经更新了我的答案。是你需要的吗?