c ++将模板化函数应用于元组的每个元素
c++ applying templated function to each element of a tuple
template<typename T>
void print(T& t)
{
std::cout << t << std::endl;
}
template<typename ... Args>
class Container
{
public:
Container(Args&& ... args)
: values_(std::forward<Args>(args)...)
{}
template<int INDEX>
typename std::tuple_element<INDEX, std::tuple<Args...> >::type& get()
{
return std::get<INDEX>(values_);
}
void display()
{
// (obviously) does not compile !
std::apply(print,values_);
}
private:
std::tuple<Args ...> values_;
};
上面的代码显示了意图但不正确(注释的地方),因为函数“打印”需要一个模板。
是否有办法为元组值的每个元素调用(适当模板化的)打印函数?
您需要像这样将元组解压到 apply
中:
void display()
{
std::apply([](auto ...ts) { (..., print(ts)); },values_);
}
这是一个demo。
请注意,此解决方案使用 fold-expression 来简化语法。
template<typename T>
void print(T& t)
{
std::cout << t << std::endl;
}
template<typename ... Args>
class Container
{
public:
Container(Args&& ... args)
: values_(std::forward<Args>(args)...)
{}
template<int INDEX>
typename std::tuple_element<INDEX, std::tuple<Args...> >::type& get()
{
return std::get<INDEX>(values_);
}
void display()
{
// (obviously) does not compile !
std::apply(print,values_);
}
private:
std::tuple<Args ...> values_;
};
上面的代码显示了意图但不正确(注释的地方),因为函数“打印”需要一个模板。
是否有办法为元组值的每个元素调用(适当模板化的)打印函数?
您需要像这样将元组解压到 apply
中:
void display()
{
std::apply([](auto ...ts) { (..., print(ts)); },values_);
}
这是一个demo。
请注意,此解决方案使用 fold-expression 来简化语法。