Как написать C++ typedef, используя decltype и declval, чтобы сделать его переносимым?
У меня есть следующее
template <typename F, typename A0>
struct ResultOf {
typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type;
};
Он был написан так, чтобы VS2010 мог иметь result_of, который работал для конкретного варианта использования. Он работает под vs2015, vs2013 и vs2010, но под gcc я получаю ошибку компиляции
error: expected nested-name-specifier before ‘decltype’
typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type;
Здесь есть очевидное маленькое исправление?
2 ответа
Решение
typename
Ключевое слово здесь не нужно. Он используется, в частности, для обозначения зависимого типа, например T::value_type
, когда компилятор не может знать, value_type
это тип. В данном случае нет зависимых типов.
Удаление typename
работает в clang, gcc и современной msvc: