模板模板参数推导与 sfinae

template template argument deduction with sfinae

无法为 foofoo2 推导模板模板参数。

如果我删除 sfinae 部分,则可以为 foofoo2 成功推导模板模板参数。

如何修复 span class 或 foofoo2

谢谢。

测试(也在 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 接受任意数量的类型(尽管我们只使用一种类型)。

Demo