【发布时间】:2021-04-09 14:11:57
【问题描述】:
我有一个函数将 (argument type, data ptr) 对作为可变参数列表(C 函数)。我想将元组解压缩到该函数中,如下所示:foo(TypeIndex<std::tuple_element_t<I, Tuple>>(), &std::get<I>(tuple));
因此我编写了以下函数:
template<typename Tuple, size_t ...I>
void doUnpack(Tuple const& tp, std::index_sequence<I...>)
{
foo((type<std::tuple_element_t<I, Tuple>>(), std::get<I>(tp))...);
}
唯一的问题是逗号运算符忽略了左侧的所有内容,使用右侧。想象一下type<> 函数现在返回 0,所以上面的计算(使用输入元组{1,2,3,4,5})为foo(1,2,3,4,5) 而不是foo(0,1, 0,2, 0,3, 0,4, 0,5)
有没有办法做到这一点?
要重现的代码:
template<typename Tp>
int type() { return 0; }
template<typename ...Args>
void fun(Args&& ...args)
{
(std::cout << ... << args) << std::endl;
}
template<typename Tuple, size_t ...I>
void doUnpack(Tuple const& tp, std::index_sequence<I...>)
{
fun((type<std::tuple_element_t<I, Tuple>>(), std::get<I>(tp))...);
}
int main()
{
doUnpack(std::tuple{1,2,3,4,5}, std::make_index_sequence<5>{});
return 0;
}
【问题讨论】:
-
这里的问题是这里的
,被解析为一个逗号操作符,它几乎忽略了它左边表达式的结果,而使用右边表达式的;而不是,作为函数参数分隔符。您是否考虑过将类型/值的std::tuple传递给您的foo,而不是将它们作为离散参数?这将巧妙地回避这个问题。 -
@SamVarshavchik 我认为这似乎是目前唯一的解决方案。谢谢!
标签: c++