-3

I have this code containing std::is_same_v available with C++17. But I've stuck with C++14 due to toolchain limitation.

template<class T, class O = T>
using IteratorOnly = std::enable_if_t<
    !std::is_same_v<typename std::iterator_traits<T>::value_type, void>, O
>;

How can I replace std::is_same_v with std::is_same? Is there any workaround to be able to compile the code with just C++14?

Megidd
  • 7,089
  • 6
  • 65
  • 142
  • `std::is_same::value_type, void>::value`. – songyuanyao Oct 10 '20 at 10:07
  • 2
    Check e.g. [this `std::is_same` reference](https://en.cppreference.com/w/cpp/types/is_same). It show (a possible) definition of `std::is_same_v`, from which it should be possible to reverse it to get the `std::is_same` usage. – Some programmer dude Oct 10 '20 at 10:17

1 Answers1

0

The error got resolved by @Someprogrammerdude comment about a is_same_v helper variable template defined here. My final code is

#ifdef My_OLD_TOOL_CHAIN

template< class T, class U >
inline constexpr bool is_same_v = std::is_same<T, U>::value;

template<class T, class O = T>
using IteratorOnly = std::enable_if_t<
    !is_same_v<typename std::iterator_traits<T>::value_type, void>, O
>;

#else // My_OLD_TOOL_CHAIN

template<class T, class O = T>
using IteratorOnly = std::enable_if_t<
    !std::is_same_v<typename std::iterator_traits<T>::value_type, void>, O
>;

#endif // My_OLD_TOOL_CHAIN
Megidd
  • 7,089
  • 6
  • 65
  • 142
  • 2
    On a totally unrelated note, all symbols beginning with double underscore are reserved in all scopes. See e.g. [What are the rules about using an underscore in a C++ identifier?](https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier) – Some programmer dude Oct 10 '20 at 11:13