当前位置: 首页 > 知识库问答 >
问题:

如何优雅地将模板参数限制为``?

祝高阳
2023-03-14

如何将Wrapper的模板参数限制为Wrapper

  1. 不要中断内容辅助(Visual Studio)。
  2. 可读性高。
    由于某些原因,大多数解决方案都喜欢黑客。
  3. 通过使用C语法规则使其在第一行变得明显。(

据我所知,有很多解决方案,但每个解决方案都不符合标准。

template<class T> class MyArray{};
template<class T,class T2> class Wrapper;
template<class T,class T2> class Wrapper<T,MyArray<T2>>{     
    using Test=int; 
};
class B{};
class C{};
int main() {
    Wrapper<C,MyArray<B>> wrapper;
    return 0;
}

此代码是从https://stackoverflow.com/a/43518221(@max66)。

IDE的上下文线索/语法突出显示将被混淆
在我的例子中,它将一些正确的类型标记为错误,例如:-

class ShowError : public Wrapper<B,MyArray<C>>{ 
    Test n=0;  //<-- unknown "Test" (intellisense)
};
template<class T> class MyArray{ 
    public: using MyArrayT=T; 
};
template<class T,class T2> class Wrapper{
    public: using myT=typename T2::MyArrayT;
    //^ assert at compile time
};

这个想法来自https://stackoverflow.com/a/43518295的评论(@Jarod42)

类声明没有提到MyArray,它只是使用一种hacky(不太可读)的方式(MyArrayT)来强制执行T2MyArray

class MyArrayBase{};
template<class T> class MyArray : public MyArrayBase{  };
template<class T,class T2> class Wrapper{
    //check something around MyArrayBase *object = new T2();
    // or "is_base_of"
};

代码从Restrict C Template参数修改为仅接受特定类型的子类和C模板。

它与解决方案2具有相同的缺点
这对于普通用户来说并不明显。

通过在模板类声明(Wrapper)上添加std::enable_if,我可以得到一个有效的hack<不幸的是,内容助理讨厌它。

以下是我阅读的其他链接:-

  • http://www.informit.com/articles/article.aspx?p=376878(模板模板参数)
  • 限制模板函数,只允许某些类型(与模板类型无关作为参数)

共有1个答案

刘松
2023-03-14

您可以编写自定义类型traitis_specialization,如下所示:

template<class Type, template<class...> class Template>
struct is_specialization
  : std::false_type {};
template<template<class...> class Template, class... TArgs>
struct is_specialization<Template<TArgs...>, Template>
  : std::true_type {};

然后您只需要对给定的模板参数断言是否为真:

template<class T,class T2>
class Wrapper {
    static_assert(is_specialization<T2, MyArray>::value, "T2 must be a specialization of MyArray");
};

 类似资料:
  • 人生太短,不能写没人会读的废话,如果你写了废话,没人会去读。所以好一点的文档是最好的。经理不会去理解这些东西,因为不好的文档会给他们错误的安全感以至于他们不敢依赖他们的程序员。如果一些人绝对坚持你真的在写没用的文档,就告诉他们“是的”,然后安静的找一份更好的工作。 没有其他事情比精确估计 把好的文档转为放松文档要求的估计 更为有效率。真相是冷酷而艰难的:文档,就像测试,会花比开发代码多几倍的时间。

  • 本文向大家介绍如何优雅地在vue中添加权限控制示例详解,包括了如何优雅地在vue中添加权限控制示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作。作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制。 需求 因为这是一个工作上的业务需求,所以对于我来说主要有两个地方需

  • 下面的代码是合法的C(用g-Wall编译干净): 但是,当我尝试使用nvcc编译此文件时,会出现以下错误: nvcc t.cu t.cu(39):警告:当重新声明未引用的函数模板时,指定默认参数是不标准的 t、 cu(39):警告:重新定义默认参数 t.cu(51):警告:重新声明未引用的函数模板时指定默认参数是不标准的 t、 cu(51):警告:重新定义默认参数 t、 cu(53):错误:模板实

  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是强行杀死(或),然后它们将不会执行。

  • 问题内容: 我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗? 问题答案: 做到这一点的好方法是让一个线程保护一个Thread的变量,并在你要停止它的时候将其设置为外部变量,例如: `class MyThread extends Thread { volatile boolean finished = false; public void stopMe(

  • 让我们假设我们有这样一个用python编写的琐碎守护进程: 我们使用< code>start-stop-daemon对其进行守护,默认情况下,它会在< code> - stop上发送< code > SIGTERM (< code > TERM )信号。 假设当前执行的步骤是。此时我们正在发送信号。 发生的情况是执行立即终止。 我发现我可以使用<code>signal.signal(signal.