Jonathan Mee
I posted a solution to this problem: https://topanswers.xyz/cplusplus?q=793#a932 But found my answer only works in GCC. The function definition looks like:
template <template <typename> class L, template <typename> class R, typename T>
std::conditional_t<std::is_same_v<L<T>, R<T>>, std::true_type, std::false_type> IsSameContainer(const R<T>&);
I've even simplified the execution code to just deriving a variable:
const auto test = decltype(IsSameContainer<std::vector>(param))::value
This still fails to compile on all but GCC. Does anyone have suggestions on how to make the function cross-platform?
[**Live Example**](https://godbolt.org/z/FP6o7-)
Top Answer
Jonathan Mee
This can be can be solved by accepting all template parameters rather than just the un-defaulted template parameter:
template <template <typename...> class L, template <typename...> class R, typename... T>
std::conditional_t<std::is_same_v<L<T...>, R<T...>>, std::true_type, std::false_type> IsSameContainer(const R<T...>&);
This will allow compilation on Clang as well: https://wandbox.org/permlink/dMvXg2ZxjPM9USi7
It can be convenient to define a templatized variable for this type as well:
template <template <typename...> class L, typename T>
static constexpr const auto is_same_container_v = decltype(IsSameContainer<L>(std::declval<T>()))::value;
Strangely Visual Studio will only allow my updated version of `IsSameContainer` if it is accessed through the templatized variable: https://godbolt.org/z/wBAHPm