gpt4 book ai didi

c++ - 有没有一种方法来存储通用的模板化函数指针?

转载 作者:行者123 更新时间:2023-12-02 09:59:16 27 4
gpt4 key购买 nike

目标:
在运行时决定要使用哪个模板函数,然后在不需要类型信息的情况下使用它。
部分解决方案:
对于参数本身未模板化的函数,我们可以执行以下操作:int (*func_ptr)(void*) = &my_templated_func<type_a,type_b>;可以修改此代码行,以用于type_atype_b不同类型的if语句中,从而为我们提供了模板化的函数,其类型在运行时确定:

int (*func_ptr)(void*) = NULL;
if (/* case 1*/)
func_ptr = &my_templated_func<int, float>;
else
func_ptr = &my_templated_func<float, float>;
仍然存在的问题:
当参数是模板指针时,该怎么办?
例如,这是我想做的事情:
int (*func_ptr)(templated_struct<type_a,type_b>*); // This won't work cause I don't know type_a or type_b yet
if (/* case 1 */) {
func_ptr = &my_templated_func<int,float>;
arg = calloc(sizeof(templated_struct<int,float>, 1);
}
else {
func_ptr = &my_templated_func<float,float>;
arg = calloc(sizeof(templated_struct<float,float>, 1);
}

func_ptr(arg);
除了我希望type_a和type_b在运行时确定。我看到部分问题。
  • 函数指针的类型是什么?
  • 如何调用此函数?

  • 我想我有(2)的答案:只需将参数转换为 void*,并且模板函数应使用函数定义进行隐式转换(如果这不起作用,请纠正我)。
    (1)因为函数指针必须包含参数类型而使我陷入困境。这与部分解决方案不同,因为对于函数指针定义,我们能够“忽略”函数的模板方面,因为我们真正需要的只是函数的地址。
    另外,也许会有更好的方法来实现我的目标,如果是的话,我会全神贯注。
    感谢@Jeffrey的回答,我得以提出以下简短示例来说明我要完成的工作:
    template <typename A, typename B>
    struct args_st {
    A argA;
    B argB;
    }

    template<typename A, typename B>
    void f(struct args_st<A,B> *args) {}

    template<typename A, typename B>
    void g(struct args_st<A,B> *args) {}

    int someFunction() {
    void *args;

    // someType needs to know that an args_st struct is going to be passed
    // in but doesn't need to know the type of A or B those are compiled
    // into the function and with this code, A and B are guaranteed to match
    // between the function and argument.
    someType func_ptr;
    if (/* some runtime condition */) {
    args = calloc(sizeof(struct args_st<int,float>), 1);
    f((struct args_st<int,float> *) args); // this works
    func_ptr = &g<int,float>; // func_ptr should know that it takes an argument of struct args_st<int,float>
    }
    else {
    args = calloc(sizeof(struct args_st<float,float>), 1);
    f((struct args_st<float,float> *) args); // this also works
    func_ptr = &g<float,float>; // func_ptr should know that it takes an argument of struct args_st<float,float>
    }

    /* other code that does stuff with args */

    // note that I could do another if statement here to decide which
    // version of g to use (like I did for f) I am just trying to figure out
    // a way to avoid that because the if statement could have a lot of
    // different cases similarly I would like to be able to just write one
    // line of code that calls f because that could eliminate many lines of
    // (sort of) duplicate code
    func_ptr(args);

    return 0; // Arbitrary value
    }

    最佳答案

    您不能使用std::function并使用lambda捕获所需的所有内容吗?您的函数似乎没有带参数,因此可以正常工作。

    std::function<void()> callIt;

    if(/*case 1*/)
    {
    callIt = [](){ myTemplatedFunction<int, int>(); }
    }
    else
    {
    callIt = []() {myTemplatedFunction<float, float>(); }
    }

    callIt();

    关于c++ - 有没有一种方法来存储通用的模板化函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63527940/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com