约束参数(位集大小)的模板参数推导失败
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;
}
这个等效形式应该可以说明问题。该概念只能在推导出 T
和L
之后检查约束成立。但是,虽然 T
很容易推导,但此函数模板定义的编写方式不允许从 b
推导 L
。因此,您遇到了需要明确指定 L
的情况。这个概念没有帮助,因为它不是函数参数的一部分,而是模板本身的一部分。
现在,碰巧问题中的用例根本不需要概念。
template<size_t L>
void stamp(std::bitset<L> const &b) {
std::cout << b << std::endl;
}
这是一个需要 std::bitset
特化的函数模板。
有没有办法让编译器使用受概念约束的模板参数推导参数 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;
}
这个等效形式应该可以说明问题。该概念只能在推导出 T
和L
之后检查约束成立。但是,虽然 T
很容易推导,但此函数模板定义的编写方式不允许从 b
推导 L
。因此,您遇到了需要明确指定 L
的情况。这个概念没有帮助,因为它不是函数参数的一部分,而是模板本身的一部分。
现在,碰巧问题中的用例根本不需要概念。
template<size_t L>
void stamp(std::bitset<L> const &b) {
std::cout << b << std::endl;
}
这是一个需要 std::bitset
特化的函数模板。