约束参数(位集大小)的模板参数推导失败

Template argument deduction for constrained parameter (bitset size) fails

有没有办法让编译器使用受概念约束的模板参数推导参数 size_t L

这是我得到的最好的

template <typename T, size_t L>
concept def_bitset = std::is_same<T, std::bitset<L>>::value;

template<size_t L>
void stamp(def_bitset<L> auto const &b) {
    std::cout << b << std::endl;
}

如果我调用它传递 L 作为模板参数

stamp<4>(bitset<4>{0b0110});

我希望能够在不重复位集大小的情况下调用 stamp。

存在检查模板参数约束的概念。概念不是类型,尽管在使用简洁符号时出现在与类型相同的位置。它不携带任何可用于模板参数推导的类型信息。

为了说明它,让我们将您的简洁函数模板定义重写为其显式形式

template<size_t L, def_bitset<L> T>
void stamp(T const &b) {
    std::cout << b << std::endl;
}

这个等效形式应该可以说明问题。该概念只能在推导出 TL 之后检查约束成立。但是,虽然 T 很容易推导,但此函数模板定义的编写方式不允许从 b 推导 L。因此,您遇到了需要明确指定 L 的情况。这个概念没有帮助,因为它不是函数参数的一部分,而是模板本身的一部分。

现在,碰巧问题中的用例根本不需要概念。

template<size_t L>
void stamp(std::bitset<L> const &b) {
    std::cout << b << std::endl;
}

这是一个需要 std::bitset 特化的函数模板。