Название немного сбивает с толку, но я имею в виду этот конкретный случай:
template<class>
struct get_type_of_nontype;
template<class T, T Value, template<T> class Template>
struct get_type_of_nontype<Template<Value>> {
using type = T;
};
Так что я могу использовать его так:
#include <type_traits>
template<int I>
class int_non_type {};
static_assert(
std::is_same<typename get_type_of_nontype<int_non_type<0>>::type, int>::value,
"T is deduced to be `int` as `template<T> class Template` is `template<int> class int_non_type`"
);
Это отлично работает в C ++17.В C ++ 14 я получаю следующие ошибки:
gcc 8:
<source>:5:8: error: template parameters not deducible in partial specialization:
struct get_type_of_nontype<Template<Value>> {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:5:8: note: 'T'
clang 7:
<source>:5:8: error: class template partial specialization contains a template parameter that cannot be deduced; this partial specialization will never be used [-Wunusable-partial-specialization]
struct get_type_of_nontype<Template<Value>> {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:4:16: note: non-deducible template parameter 'T'
template<class T, T Value, template<T> class Template>
^
И затем они оба жалуются, что struct get_type_of_nontype<int_non_type<0>>
является неполным, поэтому typename get_type_of_non_type<int_non_type<0>>::type
не может скомпилировать.
Почему это отличается между C ++ 14 и C ++ 17?Это просто ошибка компилятора?Если нет, есть ли способ сделать это в C ++ 14?