gpt4 book ai didi

c++ - 可变参数模板作为 std::function 的参数

转载 作者:太空狗 更新时间:2023-10-29 22:56:56 24 4
gpt4 key购买 nike

我想构建一个允许我使用未定义数量的参数调用成员函数的结构。现在我写了这样的东西

template<typename Class, typename Return, typename ... Args>
struct Caller
{
private:
std::function<Return(Args ...)> callerFunction;

Caller() = delete;
Caller(const Caller&) = delete;
Caller(Caller&&) = delete;
Caller& operator=(const Caller&) = delete;

public:
~Caller() = default;

Caller(Class& instance, Return(Class::*function)(Args ...))
{
callerFunction = [&instance, function](Args... args)
{
return (instance.*function)(args ...);
};
}

Return operator() (Args ... args)
{
return callerFunction(args ...);
}
};

恐怕我无法解决无法将 std::function 变量声明为 std::function<Return<Args&& ...)> callerFunction 的事实

当我尝试这样做时,编译器说它不能从 int 转换至 int&& (例如,如果参数是 int s),所以我猜测该函数看到了 Args&& ...作为右值引用的参数包。我说得对吗?

有解决办法吗?

编辑:好的,我在 Caller 构造函数中以错误的方式声明了函数。

错误的方式--> Caller(Class& instance, Return(Class::*function)(Args&& ...))

正确的方法 --> Caller(Class& instance, Return(Class::*function)(Args ...))

(我猜)正确的实现是

template<typename Class, typename Return, typename ... Args>
struct Caller
{
private:
std::function<Return(Args&& ...)> callerFunction;

Caller() = delete;
Caller(const Caller&) = delete;
Caller(Caller&&) = delete;
Caller& operator=(const Caller&) = delete;

public:
~Caller() = default;

Caller(Class& instance, Return(Class::*function)(Args ...))
{
callerFunction = [&instance, function] (Args&&... args)
{
return (instance.*function)(std::forward<Args>(args) ...);
};
}

Return operator() (Args&& ... args)
{
return callerFunction(std::forward<Args>(args) ...);
}
};

现在的问题是:为什么我仍然需要在没有双 & 的情况下声明函数?

最佳答案

当你这样定义你的类模板时:

template <typename T>
struct A {
A(T&& param)
}

然后创建一个实例:

A<int> myInstance(someIntVariable);

它不会编译。原因是 T 的类型由您明确指定(作为 int ,在 A<int> 中),并且您的类构造函数参数不再是 T&& ,但是 int&& ,所以它不再是通用引用(它接受左值和右值引用),而是常规的右值引用。

接下来,如果您向它传递某个整数,则会出现类型不匹配错误,因为您在需要右值引用时传递了一个常规变量。

在您的示例中,您明确定义了函数签名,因此同样适用 - 构造函数期望函数采用对 Args 的右值引用...,但事实并非如此。

我认为解释得更好in this question

关于c++ - 可变参数模板作为 std::function 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490403/

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