Вывод типа шаблона для нетипичного параметра шаблона - PullRequest
1 голос
/ 24 апреля 2020

У меня есть этот фрагмент, который прекрасно компилируется как с clang ++, так и с g ++, и мне кажется, что все в порядке:

template <typename T, std::vector<T> & v>
struct A{};

int main () {

  static std::vector<int> v;
  A<typename decltype(v)::value_type, v> a;

  return 0;
}

... однако A<typename decltype(v)::value_type, v> a; выглядит избыточным.

Я пытался изменить объявление шаблона A, чтобы decltype(v)::value_type автоматически выводилось, но пока безуспешно. Можно достичь A<v> a; внутри main()?

1 Ответ

1 голос
/ 24 апреля 2020

В C ++ 17 вы можете иметь:

template <auto&> struct A;

template <typename T, std::vector<T> & v>
struct A<v>
{
  // ...
};

int main()
{
    static std::vector<int> v;
    [[maybe_unused]] A<v> a;
}

Демо

В предыдущем стандарте вам требуется

template <typename T, T& v> struct A;
template <typename T, std::vector<T>& v>
struct A<std::vector<T>, v>{};

или подобное.

MACRO может помочь избежать многословного decltype(v), v использования:

#define AUTO(v) decltype(v), v
int main()
{
    static std::vector<int> v;
    A<AUTO(v)> a;
    static_cast<void>(a); // Avoid warning about unused variable
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...