Определить сигнатуру оператора ++ с помощью std :: is_detected_exact - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу определить во время компиляции, имеет ли данный тип оператор предварительного увеличения с основами библиотеки TS v2 type_traits ' is_detected_exact помощник - однако, похоже, что я неправильно понял этого помощника или я предоставил неверные параметры, следующий код не компилируется:

#include <experimental/type_traits>

template<typename T>
using operator_plusplus_t = decltype(&T::operator++);

template<typename T>
using has_pre_increment = std::experimental::is_detected_exact<T&, operator_plusplus_t, T>;

struct incrementer
{
  incrementer& operator++() { return *this; };
};

static_assert(has_pre_increment<incrementer>::value, "type does not have pre increment");

Я получаю ошибку (ошибка static_assert):

<source>:14:15: error: static assertion failed: type does not have pre increment  
static_assert(has_pre_increment<incrementer>::value, "type does not have pre increment");
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compiler returned: 1

https://godbolt.org/z/-zoUd9

Я ожидал, что этот код скомпилируется, поскольку структура "incrementer" имеет метод operator ++ без аргументов, возвращающих ссылку на его тип ...

Может быть, вы можете указать мне правильное направление, заранее спасибо!

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете использовать decltype(++std::declval<T>()) вместо.

https://godbolt.org/z/h_INw-

...