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

Jul*_*ues 6 c++ c++-concepts c++20

有没有办法让编译器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;
}
Run Code Online (Sandbox Code Playgroud)

如果我调用它L作为模板参数传递,这会起作用

stamp<4>(bitset<4>{0b0110});
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 5

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

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

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

这种等效形式应该说明问题。这个概念只能检查约束持有 TL已经推出。但是虽然T很容易推断,但此函数模板定义的编写方式不允许Lb. 因此,您遇到了L明确指定的需要。这个概念没有帮助,因为它不是函数参数的一部分,而是模板本身的一部分。

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

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

这是一个函数模板,期望std::bitset.