如何为所有派生类型部分特化类模板?

2023-11-21

我想部分专门化一个我无法更改的现有模板(std::tr1::hash) 对于基类和所有派生类。原因是我使用了奇怪的重复模板模式来实现多态性,并且哈希函数是在 CRTP 基类中实现的。如果我只想部分专门化 CRTP 基类,那么很简单,我可以编写:


namespace std { namespace tr1 {

template <typename Derived>
struct hash<CRTPBase<Derived> >
{
    size_t operator()(const CRTPBase<Derived> & base) const 
    { 
        return base.hash(); 
    }
};

} }

但这种专业化与实际的派生类不匹配,仅CRTPBase<Derived>。我想要的是一种编写部分专业化的方法Derived当且仅当它源自CRTPBase<Derived>。我的伪代码是


namespace std { namespace tr1 {

template <typename Derived>
struct hash<typename boost::enable_if<std::tr1::is_base_of<CRTPBase<Derived>, Derived>,
    Derived>::type>
{
    size_t operator()(const CRTPBase<Derived> & base) const 
    { 
        return base.hash(); 
    }
};

} }

...但这不起作用,因为编译器无法告诉你enable_if<condition, Derived>::type is Derived。如果我可以改变std::tr1::hash,我只需添加另一个虚拟模板参数即可使用boost::enable_if,根据建议enable_if文档,但这显然不是一个很好的解决方案。有办法解决这个问题吗?我是否必须在每个unordered_set or unordered_map我创造,或者完全专业化hash对于每个派生类?


以下代码有两种变体。您可以选择更适合您的。


template <typename Derived>
struct CRTPBase
{
    size_t hash() const {return 0; }
};

// First case 
//
// Help classes
struct DummyF1 {};
struct DummyF2 {};
struct DummyF3 {};
template<typename T> struct X; 

// Main classes
template<> struct X<DummyF1> : CRTPBase< X<DummyF1> > {
    int a1;
};

template<> struct X<DummyF2> : CRTPBase< X<DummyF2> > {
    int b1;
};

// typedefs
typedef X<DummyF1> F1;
typedef X<DummyF2> F2;
typedef DummyF3    F3; // Does not work

namespace std { namespace tr1 {
    template<class T>
    struct hash< X<T> > {
        size_t operator()(const CRTPBase< X<T> > & base) const     
        {         
            return base.hash();     
        }
    };
}} // namespace tr1 // namespace std 

//

// Second case
struct DummyS1 : CRTPBase <DummyS1> {
    int m1;
};
//
template<typename T> 
struct Y : T {};
//
typedef Y<DummyS1> S1;


namespace std { namespace tr1 {
    template<class T>
    struct hash< Y<T> > {
        size_t operator()(const CRTPBase<T> & base) const     
        {         
            return base.hash();     
        }
    };
}} // namespace tr1 // namespace std 

void main1()
{
    using std::tr1::hash;
    F1 f1;
    F2 f2;
    F3 f3;
    hash<F1> hf1; size_t v1 = hf1(f1); // custom hash functor
    hash<F2> hf2; size_t v2 = hf2(f2); // custom hash functor
    hash<F3> hf3; size_t v3 = hf3(f3); // error: standard hash functor

    S1 s1;
    hash<S1> hs1; size_t w1 = hs1(s1); // custom hash functor

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为所有派生类型部分特化类模板? 的相关文章

随机推荐

  • CSS 属性选择器 + 后代在 Webkit 中出现错误?

    考虑这个 CSS data color red h1 background color red data color blue h1 background color blue 还有这个 HTML div h1 red h1 div div
  • 使用 Firebase-UI (Android) 的 Firestore 聊天应用

    我正在尝试使用 Cloud Firestore 的 Firebase UI 库创建聊天 Thisgithub存储库包含我正在使用的相关代码 问题在于查询的顺序 看到查询被指定为 Query sChatQuery sChatCollectio
  • Castle Windsor IoC 属性注入简单操作方法

    好吧 我想也许有too much有关温莎城堡的信息 因为寻找这些关键字可以为我提供所有内容的示例 坦率地说 我不太了解它如何工作以正确解决此问题 我已经尝试了很多排列 但运气不佳 我有一个IUnitOfWorkFactory我想实例化为单例
  • 如何在 Xcode 5 上找到 arm-apple-darwin#-llvm-gcc-4.2 编译器?

    我正在绑定一个交叉编译 为此我需要找到 Xcode 放置 arm gcc 编译器的位置 它曾经位于 Applications Xcode app Contents Developer Platforms iPhoneOS platform
  • 在 k8s 中使用本地 docker 镜像,无需设置注册表

    我已经根据以下内容设置了单节点 kubernetes官方教程 除了官方文档之外 我还设置了单节点集群 kubectl taint nodes all node role kubernetes io master 残疾人驱逐限制 cat lt
  • Treeview ContainerFromItem 始终返回 null

    我已经阅读了有关此主题的一些主题 但找不到任何可以做我想做的事情 我有一个绑定到一组分层对象的树视图 这些对象中的每一个都代表地图上的一个图标 当用户单击地图上的某个图标时 我想在树视图中选择该项目 将焦点放在它上 然后将其滚动到视图中 地
  • 如何制作可扩展 Flutter 小部件的动画以将其滑出屏幕

    我有两个连续的可扩展按钮占据了整个屏幕宽度 单击左侧按钮时 我希望左侧按钮占据整个屏幕宽度 右侧按钮通过向右滑动到屏幕外而消失 这是我到目前为止所取得的成就 正如您所注意到的 当没有足够的空间来渲染右侧按钮时 它会在最后被压扁 我只是希望它
  • Django Rest Framework 数据库错误异常处理

    有没有办法让 Django Rest Framework 自动响应HTTP 400 STATUS什么时候出现数据库异常 IntegrityError等等 示例 我有一个具有唯一用户名字段的模型 并且我正在尝试使用通用的rest framew
  • 将文件转换为 Base64String 并再次转换回来

    标题说明了一切 我像这样读了 tar gz 存档 将文件分解为字节数组 将这些字节转换为 Base64 字符串 将 Base64 字符串转换回字节数组 将这些字节写回到新的 tar gz 文件中 我可以确认两个文件的大小相同 以下方法返回
  • 强制元素水平对齐

    假设我的 div 中有随机的子元素 其固定高度和宽度设置为 100 以便与布局同步 我必须使用哪种 CSS 来强制子元素水平对齐 并且当 div 的宽度小于内容时 显示滚动条并且不相互重叠 Fiddle http jsfiddle net
  • 如何更改 PostgreSQL 数据库表中列的位置?

    我尝试了以下方法 但没有成功 ALTER TABLE person ALTER COLUMN dob POSITION 37 改变列位置 在 PostgreSQL Wiki 中说道 PostgreSQL 目前定义了列 订单基于attnum的
  • 如何使用 Karma Runner(又名 Testaulous)提供 svg 和固定装置

    在过去的两个小时里 我一直在尝试让 Karma runner 提供 svg 文件和 html 固定装置 但到目前为止还没有成功 根据该线程的第二个答案 将 html 与 testaulousjs 集成时出错我一直在尝试使用served表明我
  • 使用 shell 脚本合并两个属性文件

    如何合并两个属性文件 例如使用 shell 脚本 如果我有两个属性文件 例如 first properties test file anish test version 3 0 second properties test author n
  • 通过单击并拖动来“检查”多个复选框?

    我有一个充满复选框的表格 如下所示 我希望能够按住鼠标并拖动以激活多个复选框 我不知道从哪里开始 我寻找答案 但只找到了另一个线程有人询问如何做 但没有答案 HTML table tbody tr td td tr tbody table
  • 在 JavaFX 2.2 桌面应用程序中嵌入 Google 地图会引发异常并且通常无法执行

    我有一个项目需要在桌面java应用程序中嵌入谷歌地图 经过一番研究后 我发现 Java FX 确实提供了此功能 并继续编写了一个示例应用程序作为 PoC 应用程序运行正常 一切都很好 升级到新的 7u7 java 版本后 我的代码不再像以前
  • 应用程序第一次升级 sqlite 数据库时崩溃

    当第一次更新 sqlite 数据库时 我的应用程序遇到崩溃 重新加载应用程序 从此一切正常 我猜这与 onUpgrade 函数有关 我似乎无法找到问题出在哪里 非常感谢任何建议 提前致谢 数据库助手 public class Databas
  • 如何在 C# 中处理 JSON?

    是否有一个简单 优雅的解析器来处理 C 中的 JSON 实际序列化 反序列化为 C 对象怎么样 JSON Net是一个相当不错的图书馆
  • 如何根据 pandas python 中的特定列合并两个数据框?

    我必须合并两个数据框 df1 company standard tata A1 cts A2 dell A3 df2 company return tata 71 dell 78 cts 27 hcl 23 我必须将两个数据帧统一为一个数据
  • 在对等方关闭的 TCP 套接字上写入

    我有一个客户端 服务器应用程序 其中每一端都通过 TCP 套接字与另一端进行通信 我正确地建立了连接 然后在客户端将任何数据写入套接字之前使服务器崩溃 我看到的是第一个write 尝试 客户端 成功 它返回实际写入的字节数 而以下返回 如我
  • 如何为所有派生类型部分特化类模板?

    我想部分专门化一个我无法更改的现有模板 std tr1 hash 对于基类和所有派生类 原因是我使用了奇怪的重复模板模式来实现多态性 并且哈希函数是在 CRTP 基类中实现的 如果我只想部分专门化 CRTP 基类 那么很简单 我可以编写 n