Как написать c ++ typedef, используя decltype и declval, чтобы сделать его переносимым? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть следующее

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 ]

0 голосов
/ 16 октября 2018

Удаление typename работает в clang, gcc и современной msvc:

https://godbolt.org/z/CfOw-_

0 голосов
/ 16 октября 2018

typename ключевое слово здесь не нужно.В частности, он используется для обозначения зависимого типа, такого как T::value_type, когда компилятор не может знать, является ли тип value_type.В данном случае нет зависимых типов.

...