如何在variadic模板类中使用lambda中的variadic参数

时间:2015-09-05 09:37:57

标签: c++ visual-studio c++11 lambda variadic-templates

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行。

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

1 个答案:

答案 0 :(得分:0)

我扩展并修复了你的代码以便编译它。如果您的下一个问题附带完整的示例,那将是很好的,这样我们就不需要扩展示例的其余部分;)

确实,我不知道你的代码对你有什么用处: - )

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);

 }