模板模板参数推导与 sfinae
template template argument deduction with sfinae
无法为 foo
和 foo2
推导模板模板参数。
如果我删除 sfinae 部分,则可以为 foo
和 foo2
成功推导模板模板参数。
如何修复 span
class 或 foo
和 foo2
?
谢谢。
测试(也在 godbolt.org)
#include <type_traits>
template<typename T>
using enable_if_t_const = typename std::enable_if<
std::is_const<T>::value
>::type;
template<typename T, typename=void> class span;
template<typename T>
class span<T, enable_if_t_const<T>> {
public:
explicit span(const T* const data) {}
};
template <typename T, template<typename> class S>
void foo() {}
template <typename T, template<typename> class S>
void foo2(S<T>& s) {}
int main() {
int arr[] = {1};
span<const int> s(arr);
foo<const int, span>();
foo2(s);
return 0;
}
这是因为,虽然您有默认模板参数,但 span
不是 template <typename> class S
。这是一个 template <typename, typename> class S
.
最简单的解决方法是将其更改为
template <typename T, template<typename...> class S>
void foo2(S<T>& s) {}
这样你就可以接受任何 S
接受任意数量的类型(尽管我们只使用一种类型)。
无法为 foo
和 foo2
推导模板模板参数。
如果我删除 sfinae 部分,则可以为 foo
和 foo2
成功推导模板模板参数。
如何修复 span
class 或 foo
和 foo2
?
谢谢。
测试(也在 godbolt.org)
#include <type_traits>
template<typename T>
using enable_if_t_const = typename std::enable_if<
std::is_const<T>::value
>::type;
template<typename T, typename=void> class span;
template<typename T>
class span<T, enable_if_t_const<T>> {
public:
explicit span(const T* const data) {}
};
template <typename T, template<typename> class S>
void foo() {}
template <typename T, template<typename> class S>
void foo2(S<T>& s) {}
int main() {
int arr[] = {1};
span<const int> s(arr);
foo<const int, span>();
foo2(s);
return 0;
}
这是因为,虽然您有默认模板参数,但 span
不是 template <typename> class S
。这是一个 template <typename, typename> class S
.
最简单的解决方法是将其更改为
template <typename T, template<typename...> class S>
void foo2(S<T>& s) {}
这样你就可以接受任何 S
接受任意数量的类型(尽管我们只使用一种类型)。