问题标签 [template-variables]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
366 浏览

c++ - 使用嵌套模板化变量解决 Visual Studio 内部编译器错误

我正在尝试编写让我索引到函数的参数类型的代码:

Live Example (ICE under VS) Live Example (working on GCC)

但是当我尝试在上使用它时,我得到一个内部编译器错误:

致命错误 C1001:编译器发生内部错误。

还有另一种方法可以解决内部编译器错误吗?

0 投票
1 回答
99 浏览

c++ - 为什么我必须专门化递归模板变量?

所以我在这里写了一个答案:https ://stackoverflow.com/a/56569397/2642059它努力log2在编译时计算,如下所示:

这很好用,但我觉得我不应该专注于:

但这给了我错误

代替template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = (0u != 0u); _Tp = int]
prog.cpp:7:61:从 prog.cpp:7:61 递归需要constexpr std::enable_if_t<true, int> log2<4u>
:从constexpr std::enable_if_t<true, int> log2<8u>
prog.cpp:10:11 需要:从这里需要 /usr/include/c++/6/type_traits:2523:61 : 错误: 没有在中命名type的类型struct std::enable_if<false, int>

有没有办法可以防止编译器将递归展开得太远?

0 投票
1 回答
240 浏览

c++ - 我可以重载模板变量吗?

我想声明这样的事情:

但是当我尝试时,我得到了这个错误

错误:重新声明template<class T> constexpr std::enable_if_t<std::is_floating_point<_Tp>::value, int []> foo
注释:先前的声明template<class T> constexpr std::enable_if_t<std::is_integral<_Tp>::value, int []> foo<T>

foo我觉得这应该是合法的,因为任何给定的模板参数都不会定义多个。我能做些什么来帮助编译器理解这一点吗?

0 投票
1 回答
129 浏览

c++ - Visual Studio 中的模板化函数指针数组

Guillaume Racicot对这个问题给出了一个很好的答案,关于我如何专门化模板变量。但是我在中创建函数指针的模板数组时遇到了麻烦。这段代码例如:

在 gcc 输出中

1
2
3

但在中仅输出:

1
2

我可以做些什么来解决这个问题吗?

0 投票
3 回答
173 浏览

c++ - 为什么专业化论证必须无效?

所以这个传奇中的另一个问题。Guillaume Racicot已经足够好,可以为我提供另一种解决方法,所以这是我提出这个问题的代码:

当我返回. void例如,在上面的代码中,enable_if_t<is_floating_point_v<decltype(details::X(T()))>, T>防止特化,而简单地删除最后一个参数并允许enable_if返回void允许特化。

我认为这表明我对这里真正发生的事情的误解。为什么必须始终使用专门的类型才能void使其正常工作?

Live Example

0 投票
1 回答
57 浏览

c++ - 模板别名、变量模板和自动类型推导无法推导模板参数

在处理我的类声明时,我在尝试使用自动类型推导时如何在非类模板中使用别名模板和模板变量有些困惑。

信号.h

我会这样使用它:

我不想模板这个类,所以我在考虑有一个内部变量模板。在课堂之外,我试图使用模板别名来描述不同的“TimeSignals”,因为“DiscreteTime”通常是描述性的,integral type并且 aContinousTime是浮点数或实数集。然而,我正在模板这个类的构造函数,它接受TimeSignal类型,并希望类根据传入的两种类型中的哪一种来推断或自动解析它的内部变量模板到该类型。最后我试图使用自动类型扣除返回该类型。

我不知道它是语法还是用法,但这让我很难过。我不确定如何使它进入工作编译状态。

这是 Visual Studio 2017 给我的当前编译器错误。

编译器错误对他们所说的很明显,但就像他们在没有任何帮助、帮助或如何解决或解决这个问题的建议的情况下对我尖叫或大喊大叫......

编辑

用户rafix07的回答给了我很大的帮助,而且很有帮助。我遗漏了几件事,如果我一直盯着它看足够长的时间,我可能最终会发现其中两件事,那就是在需要它的模板参数或参数的类中使用变量模板。另一种是在主函数中使用范围解析运算符来调用静态函数。我可以找到他们给一些时间。

让我陷入困境的一个问题是,我必须在调用它时显式地实例化我想要的类型的函数模板。这是让我为我们的头发拔掉头发的那个……

根据他的答案中的链接调整代码后,我现在可以编译,但是我现在收到未解析的外部符号的链接器错误,它与模板变量有关。这应该不是问题,只需要在 cpp 文件中定义它来解析静态变量。

0 投票
1 回答
197 浏览

c++ - 这是重载提供与非静态成员函数相同接口的静态成员函数的一种优雅方式吗?

考虑以下具有模板变量并使用模板别名和自动类型推导的非类模板。

以及使用它的程序:

输出

在类声明中;我T在静态版本中使用了一个参数并将其默认为 0,以便可以在没有任何参数的情况下调用它。如果不添加它,那么将无法重载没有参数或参数列表具有相同参数的静态和非静态成员函数。

这会被认为是快速修复还是黑客攻击,或者这是一种能够为具有相同名称和功能的静态和非静态成员函数提供相同类型接口的可能方式?

函数参数或参数是一个虚拟参数,对内部值绝对没有任何作用。

回来并再次阅读后,我可以看到一些混乱来自于我忽略了这更多地与变量模板的使用和能够访问它们有关的事实。

所以我认为真正的问题应该是:关于变量模板成员并且它们必须是静态的,通过成员函数访问它们的首选方式是什么:通过静态或非静态,或者没有偏好和选择留给程序员?

最后一件事;是否有任何不可预见的问题可能导致这种类型的设计模式 - 接口的未来后果?

0 投票
0 回答
84 浏览

c++ - 尝试理解变量模板和模板别名以正确使用

我之前问过这两个问题:

我的问题与第一个问题中提供的课程有关,这是我的Signal课程。

我试图在课堂上传达的想法是我不希望这个类成为模板。但是,我需要存储一个“时间”相关的变量,但是有两种方法可以存储它;作为整数类型:“离散”或作为浮点类型:“连续”。

我正在考虑使用模板别名来帮助简化代码。从代码中可以看出:

我是如何考虑使用模板别名的。

然后在非模板类本身内。

我有我的模板变量作为 Signal 的成员。现在为了有一个模板变量,它必须是静态的。为了测试这个类,我目前正在使用它的构造函数来实例化一些东西并将其存储到这个变量中。

现在,当访问这个变量时,我有两个选择,我可以使用范围解析运算符通过静态函数访问它,或者我可以通过对象的非静态成员函数访问它。

现在,为了使类能够正确编译和构建,这行代码必须在使用它的其他 CPP 文件中的类之外定义:

这是可以理解的,因为变量是静态成员。

这应该会给你我班级当前结构的背景。在继续添加更多内容之前,我想了解有关此代码设计的几件事。

第一个也是更简单的问题是:我的代码是否要保持原样?这将是检索变量的首选方法:

下一个比上一个更重要的问题,因为这会影响整个设计决策是......

在这种情况下我对模板别名的推理是否正确,我的最初想法或意图如下:

我希望类中的变量模板是 astd::uint64_t或 a double,但我想使用上面的名称:DiscreteTime并将ContinousTime底层类型表示为 typedef。

如果不是,我想看看其他可能的实现。

0 投票
0 回答
47 浏览

c++ - 模板类中的 Lambda 模板变量(静态 constexpr) - 类型为 template_parm_index 的意外表达式

我正在尝试在static constexpr模板类中定义一个 lambda 模板变量 ()。模板变量接受一个 NTTP,我希望它是一个size_t.

在某些情况下,我可以这样做,例如 NTTPauto不是size_t. 如果类本身不是模板类,我也可以这样做。但是,如果我尝试size_t在模板类中对 lambda 使用 NTTP (),我会得到:

internal compiler error: unexpected expression ‘&lt;enumerator>’ of kind template_parm_index

现场示例:https ://onlinegdb.com/Sk3wC7nyP

下面的代码:

0 投票
0 回答
400 浏览

templates - Consul-Termplate - 将变量插入“带秘密”证书调用的语法是什么

我正在尝试使用 vault-agent 的模板功能将服务器特定的证书和密钥从 vault 下载到我的每个领事服务器。

推荐的方法是将通用名称和 SAN 设置为 HOSTNAME.DATACENTER.DOMAIN。我正在使用模板变量来构建特定于模板中节点的 CN,但我无法获得正确的语法以在“with secret”调用中正确使用该变量

模板现在看起来像这样

当我在 with secret 调用中手动键入所需的 CN 时,它可以正常工作并写出证书,因此我的 Vault 访问正常工作。但是,当使用变量方法时,这会失败并显示“$CN 不是此角色允许的通用名称”。这似乎表明模板正在将“$CN”作为文字文本读取,而不是将其解析为设置值。

这对我来说似乎是一个语法错误,但在过去 2 天里尝试了多个选项,我希望有人能给我一个关于正确语法的指针(或者让我摆脱痛苦并告诉我我正在尝试不可能完成的任务)

在此先感谢您的帮助