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库.
如果您有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了特征的版本).
关于确定可持续性的一些额外讨论,这也很有趣:
在这里的网站上.
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |