如何推断 std::bitset<N>::reference 类型的函数模板参数?

How can I deduce function template arguments of type std::bitset<N>::reference?

提问人:Evan Bailey 提问时间:7/11/2023 更新时间:7/11/2023 访问量:56

问:

我正在尝试为 创建一个函数重载。我知道这通常没有用,因为已经存在与/从之间的隐式转换,但我认为这里是必要的(尽管我对其他建议持开放态度)。std::bitset<N>::referencebool

作为与我的用例类似的示例,请考虑尝试重载位集引用的 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

C++ 模板 -参数-推导 标准位集 嵌套类型

评论

3赞 HolyBlackCat 7/11/2023
我认为这是不可能的。此外,重载运算符必须位于 ADL 可以找到它们的位置(通常与其中一个操作数位于同一命名空间中),否则它们不可靠(很容易被阴影)。您应该使用普通函数,接受位集和索引。也许如果你看中了。std::cin >> ReadBit(bitset, 2)
2赞 BoP 7/11/2023
至于推论:一个实现可能有一个通用的“对单个位的引用”,适用于任何 N。因此,从嵌套类型中推导出 N 不仅“不需要”,而且实际上可能是不可能的。
1赞 Jarod42 7/11/2023
[OT]:避免在不涉及用户类型时使运算符过载。(例如,这些运算符将来可能存在)。

答: 暂无答案