c++ - 将 std::apply 与可变参数包一起使用

标签 c++ templates c++17 stdapply

我正在尝试创建一个通用类,它接受一组类型,将它们存储在一个元组中,并且可以对它们应用一个函数。

到目前为止我尝试的是以下内容:

#include <tuple>
struct Base{
    virtual void base_function() = 0;
};

template<typename ...T>
struct A : public Base{
    std::tuple<T...> as;
    A(T... pack):as(pack...){};
    void base_function(){
        std::apply([](auto t){t.base_function();}, as);
    }
};

struct B : public Base{
    void base_function(){};
};


struct C : public Base{
    void base_function(){};
};

struct D : A<B, C>{
    D():A(B(),C()){};
};

当在 D 上调用 base_function 时,我希望在类 B 和 C 的 base_function 上调用 apply。但是编译器生成以下错误:

error: no matching function for call to
'__invoke(A<T>::base_function() [with T = {B, C}]::<lambda(auto:1)>, std::__tuple_element_t<0, std::tuple<B, C> >&, std::__tuple_element_t<1, std::tuple<B, C> >&)'

最佳答案

std::apply的第一个参数应该是一个与元组元素数量相同的仿函数,所以在你的情况下是可变的:

template <typename ...Ts>
struct A : public Base{
    std::tuple<Ts...> as;
    A(Ts... pack) : as(pack...){}

    void base_function(){
        std::apply([](auto&... ts){(ts.base_function(), ...);}, as);
    }
};

关于c++ - 将 std::apply 与可变参数包一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54631547/

相关文章:

C++ - 可变参数函数的多个参数包

c++ - 使用C++执行脚本

c++ - 如何在程序中的两个类中声明/定义一次并使用映射列表?

C++11 std::begin 不适用于传入模板函数的 int[]

C++:友好模板参数的模板类型成员的正确语法?

c++ - 创建类的对象时函数调用的顺序

c++ - 此 OpenMP 代码使 linux 崩溃

c++ - 在类构造函数中,定义一个 T 类型的 vector

c++ - 为模板类重载运算符<<。即使使用 friend 关键字也无法获得私有(private)成员(member)

c++ - 在编译时检查未实例化的类模板是否继承自其第一个模板参数