Определить сигнатуру оператора ++ с помощью std::is_detected_exact
Я хочу определить во время компиляции, имеет ли данный тип оператор предварительного приращения с основами библиотеки TS v2 type_traits ' is_detected_exact helper - однако, похоже, что я неправильно понял этого помощника или предоставил неверные параметры, следующий код не компиляции:
#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
Я ожидал, что этот код скомпилируется, так как структура "incrementer" имеет метод operator++ без аргументов, возвращающих ссылку на его тип...
Может быть, вы можете указать мне правильное направление, спасибо заранее!
1 ответ
Решение
Ты можешь использовать decltype(++std::declval<T>())
вместо.