如何创建可以为T选择特殊容器的模板类?

InF*_*s X 3 c++ templates sfinae

如何创建一个模板类,可以理解类型T是否可以清洗,如果它是std::unodered_set用于收集类型为T?的元素.否则,我希望它使用std::set.

该类具有与上述相同的简单方法,sets例如insert(), find()等等.

template<class T>
class MySet {
public:
    MySet() {}
    bool find() {
    //some code here
Run Code Online (Sandbox Code Playgroud)

我检查类型是否operator()必须获取有关其"可靠性"的信息.为此,我使用以下构造,我在本网站上找到:

template<typename T>
class HasHash {
    typedef char one;
    typedef long two;

    template<typename C>
    static one test(decltype(&C::operator()));

    template<typename C>
    static two test(...);

public:
    enum {
        value = sizeof(test<T>(0)) == sizeof(size_t)
    };
};
Run Code Online (Sandbox Code Playgroud)

通过输入以下内容获取是否可以删除(真或假):

HasHash<HashableType>::value
Run Code Online (Sandbox Code Playgroud)

我没办法使用boost库.

ein*_*ica 5

如果您有is_hashable<T>类型特征(例如您的HasHash),那么您可以使用std::conditional,如下所示:

template <typename T>
std::conditional<is_hashable<T>::value, std::unordered_set<T>, std::set<T>>::type
Run Code Online (Sandbox Code Playgroud)

或者如果你使用的是C++ 17,它可以简化为:

template <typename T>
inline constexpr bool is_hashable_v = is_hashable<T>::value;

template <typename T>
std::conditional_t<is_hashable_v<T>, std::unordered_set<T>, std::set<T>>;
Run Code Online (Sandbox Code Playgroud)

(假设您还实现_v了特征的版本).

关于确定可持续性的一些额外讨论,这也很有趣:

检查类型是否可以清洗

在这里的网站上.