如何将任何大小的位集传递给函数?
How to pass bitset of any size to a function?
下面的程序编译得很好。
#include <iostream>
#include <bitset>
void foo(std::bitset<10> n)
{
std::cout << n.size() << "n";
}
int main()
{
std::bitset<10> n;
foo(n);
}
$ g++ -std=c++11 -Wall -Wextra -pedantic foo.cpp
$ ./a.out
10
如何修改foo()
函数,使其可以接受任何大小的bitset
?
这就是模板应该做的。因此,foo
使用非类型模板参数的函数模板
template<std::size_t N>
void foo(std::bitset<N> n)
{
std::cout << n.size() << "n";
}
然后
std::bitset<10> n10;
foo(n10);
std::bitset<20> n20;
foo(n20);
std::bitset<N>
是类型,因此您可以创建接受泛型类型的模板函数
template <typename T>
void foo (T n)
{ std::cout << n.size() << "n"; }
请注意,这个函数不仅适用于所有std::bitset
,也适用于所有带有size()
成员的类型,这些成员返回一个可以发送到std::cout
的值,就像许多STL容器(std::set
、std::vector
、std::map
等)一样。
因此,通过示例,您还可以按如下方式调用foo()
std::vector<int> v(20);
foo(v);
根据您的要求,这可能是好事,也可能是坏事。
如果你想要一个只接受std::bitset
的函数,那么你可以遵循松元尧提出的解决方案:你可以显式std::bitset
并模板化维度。
template <std::size_t N>
void foo (std::bitset<N> n)
{ std::cout << n.size() << "n"; }
但是,在这种情况下,没有必要使用size()
;你可以直接使用N
template <std::size_t N>
void foo (std::bitset<N>)
{ std::cout << N << "n"; }
如果在成瘾中,您希望foo
接受(例如)N
值范围(例如[10,20[
)的std::bitset<N>
,并且您可以使用 C++11,您可以使用 SFINAE 并编写如下内容
template <std::size_t N>
typename std::enable_if<(N >= 10U) && (N < 20U)>::type foo (std::bitset<N>)
{ std::cout << N << "n"; }
现在你有
std::bitset<10> n10;
std::bitset<15> n15;
std::bitset<25> n25;
foo(n10); // compile
foo(n15); // compile
// foo(n25); // compilation error
你也可以使用auto
,比模板声明少得多的代码
#include <iostream>
#include <bitset>
void foo(auto n)
{
std::cout << n.size() << "n";
}
int main()
{
std::bitset<15> n;
foo(n);
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 两组使用lambda函数的大括号
- 添加存储在向量中的大整数的函数出现问题
- 最大和最小 1 C++函数
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 使用带有虚函数的类的构造函数进行大括号初始化
- C++委托构造函数中用大括号括起来的初始值设定项列表
- 如何在派生构造函数的大括号中初始化基构造函数?C++
- 如何读取具有ReadFile函数的大文件
- 单行函数需要大括号吗
- 如何使用c++使用recv()函数接收大数据
- 构造函数右大括号处无法访问的代码
- C++:单向跳转到函数.任何替代方案
- 函数,该函数接受大括号构造对象的可变模板列表
- 从析构函数调用虚拟函数-任何解决方法
- 如果类构造函数的大括号闭合列表的大小错误,则编译时出错
- c++简单函数返回大值-无论输入是什么,总是相同的值- 4309838
- 我可以使用OpenACC来并行化调用某些函数的大代码吗
- 排序函数为大输入 0 提供浮点异常