如何创建C工厂功能?

时间:2010-12-13 15:05:19

标签: c

我有一个带有函数指针的结构,如下所示:

typedef int (*node_transition_func)( wint_t );

typedef struct lex_dfa_arc_t {

    node_transition_func func;
    int expected_return_val;
    struct lex_dfa_node_t * node;

} LEX_DFA_ARC_T;

现在我想创建一个返回原型函数“int func(wint_c);”的函数。例如:

node_transition_func input_equals( wint_t input, wint_t desired ) { ... }

C中是否可以使上述功能真正起作用?我试图避免为每个字母定义一个函数(例如input_equals_letter_a,input_equals_letter_b,input_equals_letter_c等)。

我的另一种方法是让node_transition_func接受wint_t和wchar_t *所需的字符,但我很好奇我的第一种方法是否有效。

谢谢!

5 个答案:

答案 0 :(得分:4)

你基本上可以模仿闭包& currying而不是“返回一个函数”,你返回一个具有函数指针和绑定变量的结构。有了几个#defines,它甚至可能看起来有点理智。

OTOH,当你使用某种语言时,你应该坚持使用它的习语。闭包不是C的强项。我建议你不要试图在C代码中过于通用,如果有疑问只使用switch(){}。

答案 1 :(得分:2)

您无法在C中动态创建新函数。由于它是编译语言,并且编译器不是标准运行时的一部分,因此必须在编译时静态定义所有代码。

答案 2 :(得分:1)

看起来你正试图用C语言进行讨论(cue clippy :-)。我认为这在C技术上是可行的。你不是想创造新的功能。您正在尝试创建现有函数的替代绑定。它在C ++中非常简单,但如果模板元编程(特别是函子和绑定)没有语法糖,你就必须手动完成所有这些工作。你的另一种方法似乎更合理。

答案 3 :(得分:0)

我猜你的这个函数会遍历一个LEX_DFA_ARC_T列表并返回匹配元素的“func”成员吗?

没有理由不应该这样做。毕竟像node_transition_func这样的函数指针仍然只是一个指针。那说它可能不是最好的解决方案。

然而,由于你说的其他事情,我对我的猜测是否正确感到有些困惑。也许更多的背景可能会帮助我们回答你。

答案 4 :(得分:0)

这可能是你在C中做最接近的事情:

    int input_equals_with_type(wint_t Input, wint_t desired) {
        // Do some stuff with regard to different type of "desired"
        return 1;
    }

    #define MAKE_NODE_TRANS_FUNC(type, wint_t desired) \
        int node_transition_func_##type(wint_t input) { \
            return input_equals_with_type(input, desired); \
        }

    MAKE_NODE_TRANS_FUNC(letter_a, letter_a_disired)
    MAKE_NODE_TRANS_FUNC(letter_b, letter_b_desired)
    // and so on...

这里的限制当然是因为函数是在编译时而不是运行时创建的,所以这不是“真正的”。但是,如果您只是尝试制作一些类型的函数,那么这就可以了。