gau*_*waj 1 static-assert compile-time c++11 c++14
我写我在哪里复制的钥匙的功能map,set,unordered_map,unordered_set的vector,现在我想添加一个编译时断言,以得到清晰的错误,如果有的试图通过一个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本身模板化的容器
您可以实现并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)
请注意,它也可以用于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)
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |