Как получить шаблон из std :: array? - PullRequest
0 голосов
/ 16 апреля 2020

Я написал простую метапрограмму, которая проверяет, совпадают ли 2 шаблона. Вот оно:

template<template<class...> class _Tp, template<class...> class _Up> 
struct is_same_template : std::false_type {};

template<template<class...> class _Tp> 
struct is_same_template<_Tp, _Tp> : std::true_type {};

И это работает (но не с std :: array)

is_same_template<std::vector, std::vector>::value // 1
is_same_template<std::map, std::map>::value       // 1
is_same_template<std::vector, std::map>::value    // 0

is_same_template<std::vector, std::array>::value  // Error: type/value mismatch at argument 2

Как это исправить?

1 Ответ

0 голосов
/ 16 апреля 2020

Вы можете сравнивать типы:

template<class T1, class T2> struct is_same_template: std::false_type {};

template<template<class, std::size_t> struct StdArray,
         class T1, std::size_t n1, class T2, std::size_t n2>
struct is_same_template<StdArray<T1, n1>, StdArray<T2, n2>>: std::true_type {};

или определять отдельный компаратор для каждой сигнатуры шаблона:

template<template<class, std::size_t, class...> class T1,
         template<class, std::size_t, class...> class T2>
struct is_same_template_T1_n1: std::false_type {};

template<> struct is_same_template_T1_n1<std::array, std::array>: std::true_type {};

В общем, нет общего интерфейса шаблона, который бы в равной степени принимал тип - и не тип-параметры.

...