首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数包后的字符串参数

参数包后的字符串参数
EN

Stack Overflow用户
提问于 2021-06-05 23:59:23
回答 1查看 90关注 0票数 1

我想编写一个可以接受任意类型的多个参数的函数write,并将它们打印到stdout。但我也希望传入一个分隔符作为最后一个参数。

代码语言:javascript
复制
template <typename... T>
void write(T &&...args, string delimiter) { // compilation error
    ((cout << args << delimiter),...);
}

用法:

代码语言:javascript
复制
write(1, ""); // single element with empty delimeter
write(1, "one", " "); // space as delimeter
write(1, "one", ","); // comma as delimeter 

现在,自动类型推导失败,因为C++希望参数包是最后一个参数。

我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2021-06-06 00:38:49

在这个blog article中有一个很好的技巧,你可以使用它。

修改write以仅接受参数包

代码语言:javascript
复制
template <typename... Ts>
void write(Ts && ...args) 
{ 
    write_indirect(std::forward_as_tuple(args...),
                   std::make_index_sequence<sizeof...(args) - 1>{});
}

现在,write_indirect简单地将参数包作为元组,并将参数的索引作为模板参数。然后,它使用get提取最后一个参数,并将其作为第一个参数传递给write_impl。其余参数从元组中解包,并作为第二个参数传递

代码语言:javascript
复制
template<typename... Ts, size_t... Is>
void write_indirect(std::tuple<Ts...> args, std::index_sequence<Is...>)
{
    auto constexpr Last = sizeof...(Ts) - 1;
    write_impl(std::get<Last>(args), std::get<Is>(args)...);
}  

现在,write_impl只是您的原始write函数,但它将分隔符作为第一个参数

代码语言:javascript
复制
template <typename... Ts>
void write_impl(std::string delimiter, Ts && ...args) 
{   
    ((std::cout << args << delimiter),...);
}

这是一个demo

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67851399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档