假设我有这些声明
template<typename T> class User;
template<typename T> class Data;
Run Code Online (Sandbox Code Playgroud)
并且想要实现User<>for T = Data<some_type> 和派生的任何类,Data<some_type>但也允许在别处定义的其他特化.
如果我还没有类模板的声明User<>,我可以简单地说
template<typename T,
typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };
Run Code Online (Sandbox Code Playgroud)
哪里
template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };
Run Code Online (Sandbox Code Playgroud)
但是,这有两个模板参数,因此与前一个声明冲突,其中User<>声明只有一个模板参数.还有什么我可以做的吗?
(注意
template<typename T,
typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)
不起作用(默认模板参数可能不在部分特化中使用),也不起作用
template<typename T> class User<Data<T>> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)
因为它不允许从中派生类型Data<>,也不允许 …
我有一个抽象基Hashable类,可以对其进行散列派生。我现在想扩展std::hash到所有从Hashable.
下面的代码应该完全做到这一点。
#include <functional>
#include <type_traits>
#include <iostream>
class Hashable {
public:
virtual ~Hashable() {}
virtual std::size_t Hash() const =0;
};
class Derived : public Hashable {
public:
std::size_t Hash() const {
return 0;
}
};
// Specialization of std::hash to operate on Hashable or any class derived from
// Hashable.
namespace std {
template<class C>
struct hash {
typename std::enable_if<std::is_base_of<Hashable, C>::value, std::size_t>::type
operator()(const C& object) const {
return object.Hash();
}
};
}
int …Run Code Online (Sandbox Code Playgroud)