gpt4 book ai didi

c++ - 如何为这个例子中的所有参数设置相同的类型?

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

只是为了练习,我正在尝试编写一个可变参数模板,将一些值输入到 vector 中。我写了以下内容:

template <class T>
void add(vector<T> *v, T n){
v->push_back(n);
}
template <class T, class... T2>
void add(vector<T> *v, T n, T2... rest){
v->push_back(n);
add(v, rest...);
}

为了测试这些,我使用以下内容:

vector<int> vI;
add(&vI, 10, 30, 25);

for (int i = 0; i < vI.size(); i++)
cout << vI[i] << endl;

一切都按预期工作,但我想知道第二个模板是否可以以仅使用一种类型(T 或 T2)的方式编写,因为 vector (push_back) 期望所有参数的类型相同?其实我想一直保证T = T2。

最佳答案

有趣的是,您当前的代码已经确保了这样的调用

add(&vI, 10, 10.f, 20); 

不编译。如果一个参数的类型不同于 vector 的值类型,那么最终它将成为调用中的第二个参数,例如

add(&vI, 10.f, 20);

然后模板参数推导将失败,因为它推导了 T 的冲突类型。

如果您想在递归深处发生推导失败时减少大量错误消息,SFINAE 或 static_assert 可以提供帮助。我个人更喜欢 Columbo 的把戏:

template<bool...> class bool_pack;
template<bool...b>
using all_true = std::is_same<bool_pack<true, b...>, bool_pack<b..., true>>;

template <class T, class... T2>
void add(vector<T> *v, T n, T2... rest)
{
static_assert(all_true<std::is_same<T, T2>{}...>{}, "T2 must be all Ts");
v->push_back(n);
add(v, rest...);
}

目前没有办法避免同时使用 T 和 T2(不修改调用)。然而,委员会正在考虑在这一领域进行潜在的改进,因此可能会在下一个标准中有所体现。

关于c++ - 如何为这个例子中的所有参数设置相同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28864200/

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