gpt4 book ai didi

c++ - 声明模板函数以接受任何容器,但只接受一个包含的类型

转载 作者:太空狗 更新时间:2023-10-29 20:09:25 26 4
gpt4 key购买 nike

我想声明一个接受不同 STL 容器的函数,但它们必须包含特定类的对象(例如,它应该接受 std::vector<double>std::deque<double> 但不接受 std::vector<std::string>)。

我已经找到了对容器和包含类型进行模板化的答案,但是我试图调整它们以固定包含类型的尝试没有成功。

最佳答案

您可以使用模板模板参数(没有错字)来做到这一点。模板函数的第一个模板参数是另一个具有可变数量模板参数的模板。第二个模板参数是可变模板参数。然后在签名中将第一个模板参数固定为您想要的类型(例如 double)并让编译器推断其余部分。

#include <deque>
#include <iostream>
#include <string>
#include <vector>

template < template < class ... > class Container, class ... Args >
void any_container(Container<double, Args...>)
{
// print what was deduced
std::cout << __PRETTY_FUNCTION__ << '\n';
}

int main()
{
std::vector<double> vd;
any_container(vd);

std::deque<double> dd;
any_container(dd);

std::vector<std::string> vs;
any_container(vs); // BOOM!
}

@PasserBy 已经暗示了一个不同的解决方案 in this comment .除了替换失败之外,您还可以将容器作为模板参数,并在 static_assert 中查询其 value_type。这样做的好处是您可以放置​​自定义错误消息。

#include <deque>
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>

template <typename Container> void any_container(Container)
{
static_assert(std::is_same<typename Container::value_type, double>::value,
"BOOM!");
// print what was deduced
std::cout << __PRETTY_FUNCTION__ << '\n';
}

int main()
{
std::vector<double> vd;
any_container(vd);

std::deque<double> dd;
any_container(dd);

std::vector<std::string> vs;
any_container(vs); // BOOM!
}

关于c++ - 声明模板函数以接受任何容器,但只接受一个包含的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46485084/

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