gpt4 book ai didi

c++ - 将参数包解压到 std::initializer_list 中?

转载 作者:行者123 更新时间:2023-11-30 02:18:49 25 4
gpt4 key购买 nike

有没有办法使用参数包来创建对象的初始化列表或将对象插入到 std::vector 中?我遇到的问题是我见过的所有参数包示例都使用传递的参数让编译器能够区分它需要调用哪个函数。问题是我没有参数只传递给函数类型。

例子:

// compiler cannot determine which function is correct
namespace impl
{
template<class T, class... U>
void get_type_impl(std::vector<MetaClass*>& types)
{
// rusty::get<T>(); just retrieves a MetaClass object for the specified type
types.emplace_back(rusty::get_type<T>());
impl::get_type_impl<U...>(types);
}

template <class T>
void get_type_impl(std::vector<MetaClass*>& types)
{
types.emplace_back(rusty::get_type<T>());
}
}

template <class... T>
std::vector<MetaClass*> get_types()
{
std::vector<MetaClass*> types;
types.reserve(sizeof...(T));
impl::get_type_impl<T...>(types);
return types;
}

示例用法:

auto types = get_types<MovementComponent, GraphicsComponent>();

编辑:

目标是创建一个对象 vector ,这些对象是根据提供的模板类型创建的。我目前遇到的问题是编译器无法推断出要使用哪个函数。因为 get_type_impl 可以具有相同的函数签名。

解决方案:

namespace impl
{
template <class T>
void get_type_impl(std::vector<MetaClass*>& types)
{
types.emplace_back(rusty::get_type<T>());
}
template<class T0, class T1, class... Tn>
void get_type_impl(std::vector<MetaClass*>& types)
{
types.emplace_back(rusty::get_type<T0>());
impl::get_type_impl<T1, Tn...>(types);
}
}

template <class... T>
std::vector<MetaClass*> get_types()
{
std::vector<MetaClass*> types;
types.reserve(sizeof...(T));
impl::get_type_impl<T...>(types);
return types;
}

解决方案是强制其中一个 get_type_impl 接受至少 2 种模板类型,而另一个只接受 1 种模板类型。这会在签名中产生足够大的差异,以便编译器确定哪个是模板类型。正确的功能。

最佳答案

不确定是否理解但是......在我看来你正在寻找如下内容(注意:代码未经测试):

template <typename ... Ts>
std::vector<MetaClass*> get_types()
{ return { rusty::get_type<Ts>()... }; }

否则,要解决get_types_impl()的问题,我建议删除第二个函数

template <class T>
void get_type_impl(std::vector<MetaClass*>& types)
{
types.emplace_back(rusty::get_type<T>());
}

并将其替换为以下地面情况

template <int = 0>
void get_type_impl (std::vector<MetaClass*> const &)
{ }

这背后的想法是通过 get_types_impl() 的第一个版本在 types 中添加 (emplace_back()) 元素,并使其成为最后一次调用,当可变类型列表 U... 为空并被调用时

impl::get_type_impl<>(types);

,被劫持(感谢默认的非类型模板参数 int=0)到地面情况。

关于c++ - 将参数包解压到 std::initializer_list 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com