[英]Pass std::tuple with variadic template parameter as its elements type to another function as a list of parameters
[英]How can I convert each parameter in a variadic function template to another type and obtain its address?
这个问题与在这里提出的其他问题类似,但有一个小转折。 我有一个像这样的常规功能:
void Bar(std::initializer_list<Base*> objects);
现在,我想创建一个函数模板,将每个参数包装在从Base
派生的类型中,并将它们传递给上面的函数。 就像是:
template <class... Params> void Foo(Params... parameters)
{
Bar({&Wrapper<Params>(parameters)...});
}
( Wrapper
类专门用于各种类型。)该代码实际上是在MSVC中编译的,但是编译器会发出警告,因为我要使用rvalue的地址(标准不允许)。 是否有一种简单,符合标准的方法来实现同一目标? (我认为我可以使用元组,integer_sequences和辅助函数来做到这一点,但我想尽可能避免这种情况。)
问题是Wrapper<T>
实例必须存在于某个地址。 执行此操作的简单方法是构造一个std::tuple<Wrapper<Params>...>
实例。 令人讨厌的部分是您必须使用std::get<N>
提取出内容。 在C ++ 14中,存在std::index_sequence
可以帮助您解决此问题。
template <class... Params, std::size_t... Idx>
void FooImpl(std::tuple<Wrapper<Params>...>& tup, std::index_sequence<Idx...>)
{
Bar({ (&std::get<Idx>(tup))... });
}
template <class... Params>
void Foo(Params... parameters)
{
std::tuple<Wrapper<Params>...> tup(Wrapper<Params>(parameters)...);
FooImpl(tup, std::make_index_sequence<sizeof...(Params)>());
}
如果您的Bar
const Wrapper<T>*
s,则另一种选择是使用C ++的常量引用规则来发挥自己的优势。
template <class... Params>
void FooImpl(const Wrapper<Params>&... parameters)
{
Bar({ (¶meters)... });
}
template <class... Params>
void Foo(Params... parameters)
{
FooImpl(Wrapper<Params>(parameters)...);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.