问题标签 [variable-templates]

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 回答
525 浏览

c++ - 使用 std::enable_if 的多变量模板特化

我试图用这些有效值简洁地定义一个变量模板:

VecXX 向量定义(SIMD 向量)需要使用如图所示的相应标量类型(例如huge<float>,对于 s 的向量float)。这可以作为VecXX::value_type或通过类型特征样式模板类 ( VectorTraits<VecXX>::value_type) 获得。

理想情况下,我想我会有类似的东西:

但我不能完全弄清楚一个工作版本(上面失败了“重新定义const T huge<T>”)。最好的方法是什么?

0 投票
1 回答
134 浏览

c++ - 隐式实例化变量模板的动态初始化顺序

我提出了一个我认为是 MSVC 中的错误的问题,但结果是实现定义的行为。我想确保我完全理解原因。我在一个翻译单元中有这个:

https://godbolt.org/z/Iwpwzf

我的期望是huge<MyClass>.value_of1.34078e+154:第 3 个定义huge应该使用第 2 个定义作为它的 init。Clang 7、GCC 8 和 ICC 19 都这样做,但 MSVC 2017 打印 0(来自T{ 0 }初始化或零初始化,idk),除非启用了注释行。

正如我现在所理解main()的,隐式实例化了huge<MyClass>and (indirectly) huge<double>,但它们的初始化是无序的:

如果变量是隐式或显式实例化的特化,则具有静态存储持续时间的非局部变量的动态初始化是无序的,如果变量是不是隐式或显式实例化的特化的内联变量,则是部分排序的,否则是有序的. [注意:显式专门化的非内联静态数据成员或变量模板专门化已订购初始化。— 尾注] [basic.start.dynamic]

这个场景属于我加粗的标准,所以它是无序的。最后有那个注释,我认为它读作“一个明确专门化的变量模板专门化已订购初始化”,但我没有完全(明确)专门化,所以它不适用。

我也看到了这个答案,这似乎与规范的上述部分冲突:

单个翻译单元(源文件)中的全局变量按照定义的顺序进行初始化。


  1. 上述推理是否正确?
  2. constexpr std::scalbn解决这个问题吗?
  3. 就使代码合法/可移植而言,当我尝试通过添加template const MyClass huge<MyClass>. 假装使用huge<double>专业化有效,但未使用代码(GCC 警告)。我知道我可以在函数中创建这些静态局部变量(冒着添加锁/防护的风险)或返回函数或类模板的值,但如果它是合法的,这个选项是最简洁的。
0 投票
1 回答
251 浏览

c++ - 喷溅结构

我有一堆这样的结构,成员数量不断增加,但成员命名一致:

我还有一个模板化函数,我希望它接受这些结构的成员之一,splatted:

我希望能够将其称为:

哪里splatter会以某种方式分裂foo,以便解决func<two>(foo.a, foo.b)

我显然可以扩展这个内联,而不用splatter,但我调用的代码func本身就是模板化的。我试过使用一个,initializer_list但我不知道如何单独基于模板类型构建一个。

不幸的是,我的编译器也不支持constexpr if调用func或构建initializer_list. 我还有其他选择吗?

0 投票
1 回答
435 浏览

c++ - 如何扩展 integer_sequence?

我有一个看起来像这样的函数:

这是我的最后一次尝试,但我的扩展仍然失败integer_sequence我希望有人能告诉我如何编写一个有效扩展为的行:

我尝试过的其他事情是:

  1. *it++ = at(rhs, I...)
  2. *it++ = at(rhs, I)...
  3. (*it++ = at(rhs, I))...

他们都给了我错误:

错误 C3520: I: 必须在此上下文中展开参数包

我如何扩展这个东西?

编辑:

@AndyG 指出这似乎是一个错误。

0 投票
0 回答
84 浏览

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

我之前问过这两个问题:

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

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

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

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

然后在非模板类本身内。

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

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

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

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

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

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

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

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

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

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

0 投票
2 回答
250 浏览

c++ - Type_traits *_v 变量模板实用程序命令无法编译

看到这个答案后,我试图为它的代码提供一个变量模板实用程序:

并像这样实现它:

因为这就是我看到在<type_traits>. 例如:

(来自MinGW的GCC 8.2.0实现)

但问题是,虽然::value语法似乎有效,但*_v语法却没有:

这会产生以下错误:

这是为什么?老实说,这个错误对我来说似乎很公平,让我思考上述答案中的代码究竟是如何工作的。它需要一个class模板和一个参数包,但是给定一个class,然后是一个包。另一方面,它专门研究这两种类型的组合,这让我有点困惑。我想知道:

  • 这里的扣除流程是什么?链接的答案没有详细说明代码的工作原理。
  • 在这种情况下如何引入*_v变量模板实用程序?
0 投票
1 回答
167 浏览

c++ - 变量模板可以作为模板模板参数传递吗?

以下无意义的示例无法编译,但是还有其他方法可以将变量模板作为模板模板参数传递吗?

尝试编译器资源管理器

0 投票
1 回答
144 浏览

c++ - 模板如何影响 const 全局变量的链接?

正如医生所说(强调我的):

在命名空间范围内声明的以下任何名称都具有内部链接

  • 非易失性非模板非内联const 限定变量(包括 constexpr),未声明为 extern 且先前未声明为具有外部链接;

所以我希望 const 模板变量具有外部链接。所以我做了一个测试

输出是:

第二列是 for constVar,并且对于不同的行(从不同的翻译单元打印)有所不同。这让我认为它实际上具有内部链接,尽管它是一个模板。

我知道我确实违反了 ODR,但只是为了了解正在发生的事情。

那么constVar实际上有内部联系吗?如果是,文档中突出显示的片段是什么意思?如果不是,那么发生了什么,为什么我们需要这个突出显示的片段?

0 投票
2 回答
83 浏览

c++ - 为什么 const 会影响 gcc 中全局变量模板实例化的链接?

我从两个翻译单元中获取以下实例化变量模板的地址:

我正在打印和b<int>的地址。这是clang所说的:cb<int>icb<int>

所有地址都是相同的,有点预期。这是gcc 所说的:

cb<int>变更地址。嗯?这是一个错误吗?如果没有,有人可以向我解释这种影响吗?

0 投票
1 回答
50 浏览

c++ - 如何使用变量模板来比较 C++ 17 中的变量类型?

我有这段漂亮的代码,它使用C++14s 变量模板

它检查两种类型是否相同。我喜欢这个,但是如果我必须自己传递类型而不是从某些变量中派生它们,这对我来说似乎毫无用处。

有没有办法使这项工作?我本以为会有这样typeid(x)的伎俩。