Выдает предупреждение при создании шаблона на основе аргументов шаблона - PullRequest
0 голосов
/ 28 января 2019

Мы хотим выдать предупреждение компилятора, если пользователь наших заголовков создает шаблон с определенными шаблонными типами, что мы делали до сих пор с помощью специализации шаблона:

#include <deque>
#include <vector>

template <typename T, template <typename...> class CONTAINER>
struct select_container {
  using _t =
      CONTAINER<T>;  // we don't have custom allocators for most containers
};

template <typename T>
struct select_container<T, std::vector> {
  using _t = std::vector<T>;  // meant for custom allocator
};

template <typename T>
struct select_container<T, std::deque> {
  using _t = std::deque<T>;  // custom allocator should also go here
  [[deprecated("We won't stop you from using deque, but please think twice "
               "(link to wiki).")]]
  constexpr static inline int __bad() {
    return 0;
  }
  enum { _bad = __bad() };
};

int foo() {
  select_container<int, std::vector>::_t vector_version;
  // select_container<int, std::deque>::_t deque_version;
  return vector_version[0];
}

Это делает работу с g ++7 (предупреждение выдается, когда в коде deque_version, и не выдает предупреждение, пока оно закомментировано).Однако при g ++ - 8 и clang ++ 5-8 предупреждение появляется всегда, даже когда не создается экземпляр select_container (т.е. при удалении foo из источника). См. В компиляторе-проводнике .

1 Ответ

0 голосов
/ 28 января 2019

Используйте атрибут для псевдонима:

template <typename T>
struct  select_container<T, std::deque> {
  using _t [[deprecated("We won't stop you from using deque, but please think twice "
               "(link to wiki).")]] = std::deque<T>;  // custom allocator should also go here
};

Это работает как для gcc, так и для clang trunk. Демо .

...