dan*_*jar 5 c methods macros function-pointers class
函数可以通过使用函数指针耦合到它们的引用结构。
struct string
{
char *value;
size_t (*size)(struct string *);
};
size_t size(struct string *this)
{
size_t i;
for(i = 0; this->value[i] != '\0'; ++i);
return i;
}
struct string *construct()
{
string this = (string)malloc(sizeof(struct string));
this.size = &size;
// ...
}
int main()
{
struct string *s = construct();
// ...
s->size(s); // explicitly pass self reference
}
Run Code Online (Sandbox Code Playgroud)
但我想摆脱this手动传递指针。我知道当您调用对象的方法时,这是在 C++ 中隐式完成的。有没有办法在 C 中为此创建一个适用于所有方法和签名的宏?
例如,我可以想到这样的语法。
s=>size(); // implicitly pass self reference
Run Code Online (Sandbox Code Playgroud)
请注意,这仅用于学习目的。我知道如果可能并且您想使用类耦合,最好只使用 C++。但我对如何在 C 中完成它很感兴趣。
是的,如果您能够使用可变参数宏功能,则有可能:
// ...
#define CALL_METHOD(x, y, ...) x->y(x, ##__VA_ARGS__)
struct string
{
char *value;
size_t (*size)(struct string *);
int (*compare)(struct string *, struct string *);
int (*set_value)(struct string *, const char *);
};
// ...
int main()
{
// ...
CALL_METHOD(s1, set_value, "foo");
CALL_METHOD(s2, set_value, "bar");
printf("s1->size(s1) = %zu;\n", s1->size(s1));
printf("CALL_METHOD(s1, size) = %zu;\n", CALL_METHOD(s1, size));
printf("s1->compare(s1, s2) = %d;\n", s1->compare(s1, s2));
printf("CALL_METHOD(s1, compare, s2) = %d;\n", CALL_METHOD(s1, compare, s2));
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1669 次 |
| 最近记录: |