gpt4 book ai didi

c++ - 使用参数包分配具有可变参数的函数指针

转载 作者:太空狗 更新时间:2023-10-29 20:33:16 26 4
gpt4 key购买 nike

我想将一个指向函数的指针存储为成员变量,该函数可以接受不同类型的可变数量的参数。

我一直在尝试使用的基本构造是沿着这些思路

template <typename... Args>
using ArgsFuncPointer = void(*)(Args...);

template<typename... Args> void varArgsFunc(Args&&... args) { }

{
ArgsFuncPointer<int, float> funcPointer = varArgsFunc;
funcPointer(1, 2.0);
}

问题是 varArgsFunc无法转换为 ArgsFuncPointer<int, float>

参见 coliru一个(非)工作示例。

最终我希望能够做这样的事情:

template <typename... Args> class Foo
{
public:
Foo(Args&&... args)
{
func(args);
}

VarArgsFuncPointer func;
}

更新

事实证明,无法编译的原因是 ArgsFuncPointer 之间的签名存在细微差别。和 varArgsFunc .与 ArgsFuncPointer参数包通过右值引用传递,而使用 varArgsFunc参数包按值传递。

这个有效:

template <typename... Args>
using ArgsFuncPointer = void(*)(Args&&...);

template<typename... Args> void varArgsFunc(Args&&... args) { }

{
ArgsFuncPointer<int, float> funcPointer = varArgsFunc;
funcPointer(1, 2.0);
}

工作示例 here

最佳答案

问题是 varArgsFunc是一个模板,不是一个特定的函数,而是ArgsFuncPointer<int, float>是指向特定函数的指针。

未经测试,但您应该能够通过指定其模板参数来指定实际的函数实例:

ArgsFuncPointer<int, float> funcPointer = varArgsFunc<int, float>;
// ^^^^^^^^^^^^
// Must specify template arguments

另一方面,我建议您使用 std::function 而不是指向非成员函数的指针。这将允许您使用 std::bind lambdas或者任何可调用对象。

使用 std::function将与您现在拥有的非常相似:

template <typename... Args>
using ArgsFuncPointer = std::function<void(Args...)>;

然后使用 lambda 你可以做类似的事情

ArgsFuncPointer<int, float> funcPointer = [](int i, float f)
{
varArgsFunc(i, f); // Call the real function
};

关于c++ - 使用参数包分配具有可变参数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56251861/

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