Концепция проверки работоспособности шаблона - PullRequest
2 голосов
/ 19 апреля 2019

С C ++ 20 и концепциями за углом я подумал, можно ли написать концепцию, чтобы проверить, есть ли у Type функция с определенным именем, которая принимает любое количество произвольных аргументов.

Возьмем, к примеру, следующий код (с текущим концептуальным синтаксисом TS GCC):

template <typename T>
concept bool Initializable = requires(T t) {
  { t.init() } ->void;
};

struct S {
  void init() {}
};

static_assert(Initializable<S>);

Концепция Initializable проверяет, реализует ли Type функцию void init ().Теперь давайте предположим, что есть другой тип, который также имеет функцию init, но требует аргументов, например, int:

struct T {
  void init(int) {}
};

Теперь в этом случае статическое утверждение не будет выполнено.

Есть ли способ заставить Инициализируемый концепт игнорировать аргументы функции?Этот пример может показаться довольно производным, но для чего-то вроде универсального сериализатора могут быть варианты использования для такой концепции.

1 Ответ

3 голосов
/ 19 апреля 2019

Для этого есть черта типа std::is_member_function_pointer. Но если вы хотите, чтобы тип возвращаемого значения тоже был void, то вы можете сделать оба одновременно:

template <typename>
struct mptr_returns_void : std::false_type {};

template <typename T, typename ...Args>
struct mptr_returns_void<void(T::*)(Args...)> : std::true_type {};


template <typename T>
concept Initializable = mptr_returns_void<decltype(&T::init)>::value;
...