| #include <cstdio> | |
| #include <iterator> | |
| #include <memory> | |
| #include <optional> | |
| #include <unordered_map> | |
| #ifdef _MSC_VER | |
| # include <comdef.h> | |
| #endif | |
| template <typename T, | |
| typename std::invoke_result<decltype(&T::get), T>::type = nullptr> | |
| typename T::pointer get_ptr(T& item) | |
| { | |
| return item.get(); | |
| } | |
| int main() | |
| { | |
| int a[] = { 0, 1, 2 }; | |
| auto ai = std::cbegin(a); | |
| int b[] = { 2, 1, 0 }; | |
| auto bi = std::cend(b); | |
| auto ci = std::size(a); | |
| std::unique_ptr<int> u(new int(0)); | |
| // Intel compiler do not handle correctly 'decltype' inside 'invoke_result' | |
| get_ptr(u); | |
| #ifdef _MSC_VER | |
| // clang-cl has problems instantiating this constructor in C++17 mode | |
| // error: indirection requires pointer operand ('const _GUID' invalid) | |
| // return *_IID; | |
| IUnknownPtr ptr{}; | |
| IDispatchPtr disp(ptr); | |
| #endif | |
| std::optional<int> oi = 0; | |
| return *u + *ai + *(bi - 1) + (3 - static_cast<int>(ci)) + oi.value(); | |
| } |