繁体   English   中英

如何将可变参数函数模板中的每个参数转换为另一种类型并获取其地址?

[英]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({ (&parameters)... });
}

template <class... Params>
void Foo(Params... parameters)
{
    FooImpl(Wrapper<Params>(parameters)...);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM