Static assert to check map, set, unordered_map, unordered_set

c++11, c++14, compile-time, static-assert

Solution

You can implement and use `is_specialization_of` as a generic solution:

template <typename, template <typename...> class>
struct is_specialization_of : std::false_type
{
};

template <template <typename...> class TTemplate, typename... Ts>
struct is_specialization_of<TTemplate<Ts...>, TTemplate> : std::true_type
{
};

template <typename container>
auto CopyKeyToVector(container c)
{
    static_assert(
        is_specialization_of<container, std::map>{} || 
        is_specialization_of<container, std::unordered_map>{}, "");
}

Full example on wandbox.

Note that it can also be used with `std::enable_if`:

template <typename T>
constexpr auto is_map_or_umap = 
    is_specialization_of<T, std::map>{} || 
    is_specialization_of<T, std::unordered_map>{};

template <typename container>
auto CopyKeyToVector(container) -> std::enable_if_t<is_map_or_umap<container>>
{
    // (1)
}

template <typename container>
auto CopyKeyToVector(container) -> std::enable_if_t<!is_map_or_umap<container>>
{
    // (2)
}

int main()
{
    CopyKeyToVector(std::map<int,float>{});           // Calls (1) 
    CopyKeyToVector(std::unordered_map<int,float>{}); // Calls (1)
    CopyKeyToVector(std::vector<int>{});              // Calls (2)  
}

Full example on wandbox.

Problem

I am writing a function where I am copying Keys of `map`, `set`, `unordered_map`, `unordered_set` to a `vector`, now I want to add a compile time assert to get clear error if some try to pass a `vector`, `list` in that function. ``` template <typename container> auto CopyKeyToVector(conatiner c) { //static assert to check c is map, unordered map only? } ``` Any idea how we can do that- as `map`, `unordered_map` itself templatized container

Original source

Related problems