static_assert()的优雅方式是订购标准库容器类型?

Chr*_*ine 9 c++ templates stl static-assert c++11

在模板化函数中,其中一个参数是类型的标准库容器T,我可以轻松地静态断言这T是一个有序容器吗?

有没有更优雅的方式来做这个比做类型特定的事情,比如测试一个hash_function()功能的存在来区分std::mapstd::unordered_map

bst*_*our 4

另一个简单的:

template <template <typename...> class Container>
struct is_ordered : std::false_type {};

template <> struct is_ordered<std::map>      : std::true_type {};
template <> struct is_ordered<std::set>      : std::true_type {};
template <> struct is_ordered<std::multimap> : std::true_type {};
template <> struct is_ordered<std::multiset> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)

然后就static_assert(is_ordered<Container>::value, "error")可以使用它了。扩展到自定义容器也非常容易:只需添加像上面这样的行。

如果您不想在调用站点使用模板模板,您可以随时将其包装起来:

template <typename T> struct is_ordered_2 : std::false_type {};
template <template <typename...> class Container, typename... Ts>
struct is_ordered_2<Container<Ts...>> : is_ordered<Container> {};
Run Code Online (Sandbox Code Playgroud)

然后你可以以任何一种方式使用它。