如何将任何大小的位集传递给函数?

How to pass bitset of any size to a function?

本文关键字:函数 任何大      更新时间:2023-10-16

下面的程序编译得很好。

#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::setstd::vectorstd::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);
}