将 std::apply 与可变参数包一起使用
Using std::apply with variadic packs
我正在尝试创建一个泛型 class,它接受一组类型,将它们存储在一个元组中,并且可以对它们应用一个函数。
到目前为止我尝试的是以下内容:
#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 时,我希望在 base_function 上从 class B 和 C 调用 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
并没有按照您的想法行事。它用于将参数元组传递给函数(可调用类型)。换句话说,元组本身没有名为 base_function
的函数。参见 https://en.cppreference.com/w/cpp/utility/apply
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);
}
};
我正在尝试创建一个泛型 class,它接受一组类型,将它们存储在一个元组中,并且可以对它们应用一个函数。
到目前为止我尝试的是以下内容:
#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 时,我希望在 base_function 上从 class B 和 C 调用 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
并没有按照您的想法行事。它用于将参数元组传递给函数(可调用类型)。换句话说,元组本身没有名为 base_function
的函数。参见 https://en.cppreference.com/w/cpp/utility/apply
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);
}
};