[英]Call variadic function template with template parameters of variadic class template?
[英]variadic template class to make a deferred call to a variadic template function
我可以创建一个模板类,在属性中存储一些值,然后让我调用一个用这个arg调用函数的方法。 像这样 :
template <typename U> void g(U u) { cout << u << endl; }
template <typename U> class C {
public:
U u;
C(U u) { this->u = u; }
void m() { g(u); }
};
int main() {
C<double> c(5.5);
c.m();
}
但是如何使用可变参数模板? 我想写一些类似的东西:
template <typename ... T> void f(T... a) { cout << "generik" << endl; }
template <typename ... T> class B {
public:
T... arg;
B(T... arg) {
this->arg = arg;
}
void m() { f(arg); }
};
int main() {
B<int,double> b(1,1.1);
b.m();
}
我知道它不起作用,因为我们不能声明解压缩参数类型的成员。
我可以对列表的某些参数进行模式匹配,然后在给定给定数量的参数的情况下调用函数,但我想以通用方式进行。 有一种优雅的方式吗?
您可以使用以下内容:
template <typename... Ts> class B
{
public:
std::tuple<Ts...> t;
B(Ts... args)
: t(args...)
{
}
void m() { call_f(std::index_sequence_for<Ts>()); }
private:
template <std::size_t ... Is>
void call_f(std::index_sequence<Is...>)
{
f(std::get<Is>(t)...);
}
};
请注意, std::index_sequence_for
( std::make_index_sequence
)和std::index_sequence
是C ++ 14,但可以用C ++ 11编写。
实例 。
#include <iostream>
#include <functional>
using namespace std;
template<typename... T>
void f(T... a)
{
std::initializer_list<int> {(std::cout<<a<<" ", 0)...};
}
template<typename... T>
class Defer
{
private:
std::function<void()> func;
public:
Defer(T... a) : func(std::bind(f<T...>, a...)) {}
void call() {func();}
};
int main()
{
Defer<int, float, int, const char*> d(1, 1.1, 2, "Hey");
d.call();
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.