静态断言检查map,set,unordered_map,unordered_set

gau*_*waj 1 static-assert compile-time c++11 c++14

我写我在哪里复制的钥匙的功能map,set,unordered_map,unordered_setvector,现在我想添加一个编译时断言,以得到清晰的错误,如果有的试图通过一个vector,list在该功能.

template <typename container>
auto CopyKeyToVector(conatiner c)
{
  //static assert to check c is map, unordered map only?


}
Run Code Online (Sandbox Code Playgroud)

任何想法,我们该怎么办但─因为map,unordered_map本身模板化的容器

Vit*_*meo 5

您可以实现并is_specialization_of用作通用解决方案:

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>{}, "");
}
Run Code Online (Sandbox Code Playgroud)

关于wandbox的完整示例.


请注意,它也可以用于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)  
}
Run Code Online (Sandbox Code Playgroud)

关于wandbox的完整示例.