基于适用于所有派生策略的基本策略获取模板类专业化

2024-02-23

我有一些源自基本策略的策略。某些类专门用于派生策略,而其他类仅专门用于基本策略并且可以与所有派生策略一起使用。

我遇到的问题是代码重复太多(主要是类本身的构造函数和一些样板代码)。下面的代码可以更好地解释我的意思:

struct BasePolicy {};
struct DerivedPolicy1 : public BasePolicy {};
struct DerivedPolicy2 : public BasePolicy {};
//... more policies deriving from BasePolicy (or other BasePolicies)
struct AnotherPolicy {};

template <typename T>
struct Foo;

// This struct can work for all BasePolicy types which includes all derivations
// of it (but doesn't because it is specialized for BasePolicy only)
template<>
struct Foo<BasePolicy>
{
  //... many constructors along with code
};

template<>
struct Foo<AnotherPolicy>
{
  //... more code
};

/* Would like to avoid the following code as it duplicates the above when it 
   comes to constructors and other things such as typedefs */
//template<>
//struct Foo<DerivedPolicy1> : Foo<BasePolicy>
//{
//  //... same constructors as Foo<BasePolicy>
//};
//
//template<>
//struct Foo<DerivedPolicy2> : Foo<BasePolicy>
//{
//  //... same constructors as Foo<BasePolicy>
//};

int main()
{
  // would like this to compile without uncommenting the commented out code and
  // without having the client (i.e. the line below) to somehow get the base
  // type of the policy (although if it can be done transparently, that will
  // work)
  Foo<DerivedPolicy1> a; 
};

有没有办法让派生策略被专门用于基本策略的类接受?我希望客户不要做任何额外的事情。

以下不是有效的 C++ 代码,但我希望发生这样的事情(如果您记住上面的代码):

template<>
struct Foo<BasePolicy | DerivedPolicy1 | DerivedPolicy2>
{
  //... many constructors along with code
};

这是 SFINAE 的一个案例。

template< typename Policy, ...some_condition... >
struct Foo<Policy>
{
 ...
};

您应该准确地确定 some_condition 是什么。您可以指定 Policy 派生自 BasePolicy:

template< typename Policy, enable_if< is_base<BasePolicy, Policy> > >

或者您可以明确列出允许的策略:

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

基于适用于所有派生策略的基本策略获取模板类专业化 的相关文章

随机推荐

  • 如何在同一个组件中初始化和使用上下文?

    我有一个名为 SortContext 的上下文 我想做的是初始化这个上下文 创建它的提供者 然后在同一个组件中使用该上下文 这可能吗 例如 export default function MyComponent children const
  • 连接两个 numpy 矩阵

    如果你有两个 numpy 矩阵 如何将它们连接在一起 它们应该水平连接 以便 0 1 0 1 1 0 1 0 4 1 4 1 0 1 0 1 例如 对于这些矩阵 gt gt type X gt gt type Y gt gt X shape
  • Swift 可以将类/结构数据转换为字典吗?

    例如 class Test var name String var age Int var height Double func convertToDict gt String AnyObject let test Test test na
  • React 使表格可点击并编辑详细信息

    如何使表格行可单击以编辑和更新详细信息 我正在从 pouchdb 检索这些详细信息 我将部分代码粘贴到下面以供您评估 this state docs this db this props db componentDidMount this
  • 计算图像中圆心的坐标

    假设我有这张图像 我想得到 X Y 中每个圆的中心 MatLab 有没有算法可以做到这一点 只需拨打一次电话即可实现区域属性 http www mathworks nl help images ref regionprops html im
  • Django:检查模板中ManyToMany字段的值

    我的 Django 应用程序中有以下模型 class Group models model name models CharField max length 30 users Models ManyToManyField User 在我的模
  • 是否可以阻止远程脚本在 iframe 内加载?

    我正在动态创建 iframe 并且我想阻止不是源自 iframe 来源的脚本 这可能吗 通过 JavaScript jQuery 例如 如果我的页面加载 iframeexample com内容 我想要example com要运行的脚本 但我
  • 关于函数声明中的函数指针

    include
  • 以不同(非 root)用户身份从 PHP 运行 shell 脚本

    我正在尝试在 Ubuntu 服务器上从 PHP 运行非特权用户拥有的 shell 脚本 权限问题使得运行它exec 不切实际 因为它是www data正在运行它 我用谷歌搜索了一下 发现对 suExec 的各种引用 对于这么小的问题来说 这
  • 测试 Selenium 的 onbeforeunload 事件

    我正在尝试为网页编写一个 Selenium 测试 该测试使用 onbeforeunload 事件在离开之前提示用户 Selenium 似乎无法识别出现的确认对话框 或者提供点击 确定 或 取消 的方法 有什么办法可以做到这一点吗 我正在使用
  • 最重要的常量和右值引用

    在 C 03 中 您可以使用const 将临时变量的生命周期延长到引用的生命周期的技巧 或 最重要的常量 我的问题是 在 C 0x 中 这种行为是否扩展到右值引用 IEauto x someFunction 根据 class tempora
  • 有没有办法强制 Google Speech api 仅返回单词作为响应?

    我正在使用谷歌这个API language code key 我的密钥 用于语音识别 并且效果非常好 问题在于数字 即如果我说one two three four结果将是1234如果我说one thousand two hundred th
  • ARKit:如何通过 hitTest 命中 SCNNode?

    我有几架飞机被 ARKit 检测到并对用户可见 我希望用户能够单击屏幕 以便仅保留他选择的平面 更改其颜色并删除其他平面 我的飞机被添加到 didAddNode 委托方法中 如下所示 Plane plane Plane alloc init
  • Scala 中的集合和 toArray

    Java代码 Collection
  • 从特定客户端 UDP 捕获数据包 (Python)

    我有一个关于嗅探来自特定客户端的数据包的问题 我正在运行一个非常简单的 UDP 服务器 如下所示 from socket import IPv4 Port 54345 ServerSock socket AF INET SOCK DGRAM
  • AngularJs - 从指令调用控制器函数

    在 angularjs 项目中 我使用指令通过将文件拖放到拖放区来上传文件 在指令中 我需要调用控制器中定义的函数 这是我正在做的事情 function use strict angular module app controller my
  • 复制时如何使用 NSFileManager 覆盖文件?

    我正在使用此方法来复制文件 fileManager copyItemAtPath sourcePath toPath targetPath error error 我想覆盖已经存在的文件 此方法的默认行为是引发异常 错误 文件存在 当文件存
  • 从字典中读取可能存在或可能不存在的值的线程安全方法

    所以 我已经被 ConcurrentDictionary 宠坏了 它太棒了TryGetValue方法 但是 我只能使用常规词典 因为它位于针对手机和其他平台的可移植类库中 我正在尝试编写字典的一个非常有限的子集并以线程安全的方式公开它 我基
  • 在react js Material-ui中删除芯片

    我使用react js和Material ui芯片 我添加了很多芯片 然后一个芯片与文本一起出现 我想要有删除芯片的功能 但我不知道如何删除它 我怎样才能删除它onDelete 这只是我的代码的一部分 import React useEff
  • 基于适用于所有派生策略的基本策略获取模板类专业化

    我有一些源自基本策略的策略 某些类专门用于派生策略 而其他类仅专门用于基本策略并且可以与所有派生策略一起使用 我遇到的问题是代码重复太多 主要是类本身的构造函数和一些样板代码 下面的代码可以更好地解释我的意思 struct BasePoli