如何创建 function-template,扩展 parameter-pack 不代表函数参数?
How to create function-template, that expands parameter-pack which doesn't represent function argument(s)?
抱歉,我用标题的一句话表达案例有很大问题
问题:
我有一个基于许多 "properties" 的 class 模板(不要把这个 "property" 关键字看得太字面意思):
template<typename ... P>
class C: public P... {}
然后我想要单独的、自由的函数模板,它有两个实例并为每个实例执行一些调用 "property":
template<typename ... P>
void foo(C<P> &c1, C<P> &c2)
{
{ doSomething<p>()... } // for each type p in pack P
}
template<typename T>
void doSomething() {}
问题是 P 不代表我的一组函数参数。相反,它参数化参数类型。所以我不知道怎么写"expansion"。
这样的事情可能吗?
在我看来,您只是缺少函数参数中的参数包扩展。然后还有一个小错字(p
->P
),您似乎打算使用折叠表达式为语法略有不同的所有类型执行函数:
template<typename ... P>
void foo(C<P...> &c1, C<P...> &c2)
{
// Parentheses and comma required to signify fold expression using the comma operator
( doSomething<P>(), ... );
}
我还觉得你想将 c1
和 c2
传递给 doSomething
(我猜这可能应该将对象视为 T&
? ),否则该函数将仅取决于类型,而不是该类型的实际对象。
抱歉,我用标题的一句话表达案例有很大问题
问题: 我有一个基于许多 "properties" 的 class 模板(不要把这个 "property" 关键字看得太字面意思):
template<typename ... P>
class C: public P... {}
然后我想要单独的、自由的函数模板,它有两个实例并为每个实例执行一些调用 "property":
template<typename ... P>
void foo(C<P> &c1, C<P> &c2)
{
{ doSomething<p>()... } // for each type p in pack P
}
template<typename T>
void doSomething() {}
问题是 P 不代表我的一组函数参数。相反,它参数化参数类型。所以我不知道怎么写"expansion"。 这样的事情可能吗?
在我看来,您只是缺少函数参数中的参数包扩展。然后还有一个小错字(p
->P
),您似乎打算使用折叠表达式为语法略有不同的所有类型执行函数:
template<typename ... P>
void foo(C<P...> &c1, C<P...> &c2)
{
// Parentheses and comma required to signify fold expression using the comma operator
( doSomething<P>(), ... );
}
我还觉得你想将 c1
和 c2
传递给 doSomething
(我猜这可能应该将对象视为 T&
? ),否则该函数将仅取决于类型,而不是该类型的实际对象。