提问人:Evan Bailey 提问时间:7/11/2023 更新时间:7/11/2023 访问量:56
如何推断 std::bitset<N>::reference 类型的函数模板参数?
How can I deduce function template arguments of type std::bitset<N>::reference?
问:
我正在尝试为 创建一个函数重载。我知道这通常没有用,因为已经存在与/从之间的隐式转换,但我认为这里是必要的(尽管我对其他建议持开放态度)。std::bitset<N>::reference
bool
作为与我的用例类似的示例,请考虑尝试重载位集引用的 istream 提取运算符:
#include <bitset>
#include <iostream>
template<typename Ch, typename Tr, std::size_t N>
std::basic_istream<Ch, Tr> &operator>>(
std::basic_istream<Ch, Tr> &is,
typename std::bitset<N>::reference &ref)
{
bool x;
is >> x;
ref = x;
return is;
}
int main()
{
std::bitset<4> X;
std::cin >> X[2];
std::cout << X[2];
}
这至少无法编译 GCC 和 Clang,因为编译器无法推断出大小 N。
以下是我已经考虑过的一些想法,这些想法并不能完全解决问题:
- 进行更通用的重载,并尝试 SFINAE 输出不需要的实例化。但是,我不知道有任何方法可以明确测试给定类型是否为位集引用,我担心这可能会导致将来出现不明确的重载错误。
- 使用扣款指南。但是,我不知道如何仅给定引用类型来获得 N 的值,即使这是可能的,我也希望代码在 C++14 中工作。
- 修改 STL 实现。对于我的用例来说,这是不可能的。
- 实现我自己的位集。如果可能的话,我宁愿使用。
std::bitset
关于这个问题的评论说,在一般情况下,这种事情是不可能的。在特殊情况下,有没有比这些选项更好的方法?提前致谢!std::bitset<N>::reference
答: 暂无答案
评论
std::cin >> ReadBit(bitset, 2)