如何使用可变参数的lambda从可变模板类

How to use variadic parameter in lambda from variadic template class

本文关键字:何使用 变参 参数 lambda      更新时间:2023-10-16
template<typename FirstArgT, typename...ArgsT>
class Server :public Server<ArgsT...> {
public:
    Server(const function<void (FirstArgT, ArgsT...)>& func) 
        :Server<ArgsT...>([&](ArgsT args...) -> void { func(arg0, args...); }) { }
private:
    FirstArgT arg0;
}

但是编译器说:

错误C3520 'ArgsT':参数包必须在此上下文中展开

错误C3546 '…':没有可用于展开

的参数包

在第4行和第5行

是否可以使用可变参数作为lambda的参数是VS2015,或者有另一种方法来做到这一点?

我扩展并修复了您的代码以使其编译。如果你的下一个问题有完整的例子,那就太好了,这样我们就不需要扩展示例的其余部分;)

确实,我不知道你的代码是什么好:-)

template<typename ...T> class Server;
template<typename FirstArgT, typename...ArgsT>
class Server<FirstArgT,ArgsT...> :public Server<ArgsT...> {
    public:
        Server(const std::function<void (FirstArgT, ArgsT...)>& func)
            :Server<ArgsT...>([&](ArgsT ... args)-> void { func(arg0, args...); }) { }
    private:
        FirstArgT arg0;
};
template<typename FirstArgT>
class Server<FirstArgT>
{
    public:
    Server(const std::function<void (FirstArgT)>& func) {}
};

void Do( int, double) {}

int main()
{
    Server<int,double> se( &Do );
}

如果您的意图只是将参数存储在某个地方,并使用存储的参数调用函数,则只需使用std::bind

void Do( int i, double d) { std::cout << i << " " << d << std::endl; }
int main()
{
    auto fx= std::bind( &Do, 1, 2.34);
    fx();
    // which works also for lambda:
    auto fx2=
     std::bind( []( int i,double d )->void
      { std::cout << i << " " << d << std::endl; }, 4, 5.6);
 }