问题标签 [template-aliases]
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.
c++ - 类型到值元函数可以用作 C++14 中的变量别名吗?
在查看 C++14 元函数别名提案(TransformationTraits Redux, v2,N3655)时,我注意到,不仅类型到类型的转换(例如add_const
),类型到值的元函数(例如is_void
)也是类型别名。(在N3797中不存在)。
别名类型对值元函数有什么好处吗?我认为,可以在没有这些别名的情况下使用它们,例如enable_if_t<is_void<T>::value,T>
或者enable_if_t<is_void<T>{}(),T>
当存在转换操作时。(我猜is_void<T>::type::value
是一样的is_void<T>::value
)
如果值元函数的类型需要是别名,将它们别名为变量模板会更好吗(我没有 C++14 编译器并且从未使用过变量模板。所以语法可能是错误的)?例如别名is_void
为
代替
这样就可以enable_if_t<is_void_t<T>,T>
不用boost风格写了enable_if
,写表达会更容易(egenable_if_t<(is_void_t<T> || is_integral_t<T>),T>
c++ - 特定位置的 C++ 模板别名(使用)
在这种情况下,我需要通过using
(或任何其他方法)使用类型别名:
在我写HERE
的地方,结构内部定义了很长且不止一种类型,typename <very long templated struct dependent on T>::type
我不想写,而是想写一个快捷方式。
我在更多情况下遇到了这种情况,例如模板特化和后缀返回类型语法。那么在第一行和结构/类或函数using
之间的位置是否有任何使用方式(没有双关语)?template <...>
我尝试过使用,
(逗号)类似(using X = ... , /*actually using X*/)
但没有成功的东西。
有效的是全球范围的using
但我不想要全局范围,我希望范围仅适用于我使用它的模板。我不想写DT<Iterator>
,只是DT
。
不用说宏或任何预处理器指令都是不可能的。
现实生活中的例子:
在这里,我想要一个快捷方式,typename DereferenceType<Iterator>::type&
例如:
谢谢你。
c++ - Visual Studio 2013 模板别名
以下代码
在 MSVC 2013 中生成错误:
错误 C3203:“enable_if_integral_t”:未专门化的别名模板不能用作模板参数“启用”的模板参数,应为真实类型
但在 gcc 中编译得很好。
此代码是否符合 C++11 标准和 Visual Studio 错误/未实现的功能,或者它不符合标准,而是 gcc 扩展。
有什么办法可以在 VS 中完成这项工作吗?
谢谢你。
templates - 在 C++11 中为迭代器键入别名/使用声明
我无法让我认为应该工作的 using 声明工作:
这基本上是 Stroustrup 书中的一个例子,它不会编译。第一部分 (find_all1) 可以,但尝试使用 using 声明的模板版本不会。
错误喷吐的前导部分如下所示:
还有更多,但我认为重要的部分是关于 using 声明。
c++ - is_same_template 在模板别名上的奇怪行为
以下程序...
...输出...
...用g++ 4.8.1,clang 3.4和vc++ 18.00.21005.1 编译。
这是这些编译器中的错误还是标准的要求?
c++ - 匹配模板别名作为模板模板参数
我目前正在编写一个元函数来评估表达式,例如 boost::mpl::apply:
如您所见,我使用 C++11 模板别名来避免typename ::result
在使用评估器时写入。
在其他特化中,eval_impl
(评估元函数的实现)有一个特化,用于用户传递参数化表达式(如元函数)和一组参数的情况。换句话说,用作eval
高阶元函数来评估具有一组指定参数的元函数。
对于这种情况,我写了一个专业化如下:
现在考虑一个用例:
在这里,我们将自定义元函数定义 first_of
为模板别名,并将其eval
与一组要调用(评估)的参数一起传递给。_1
, _2
... 只是占位符。
我曾期望eval
调用上面定义的专业化实例,但事实并非如此。如果别名类型本身不是类型,而是单参数模板,则 GCC 4.8.1 会说:
错误:需要一个模板参数,提供了两个
在该eval_impl
专业化的实例化点。
所以错误让我认为模板别名没有被部分专业化的模板模板参数所采用,而是匹配了别名类型。
正如您在示例中看到的那样,这不是我想要的,我需要将模板别名与任何其他元函数匹配。有没有办法做到这一点?
c++ - 使用 boost::shared_ptr 以便稍后替换它
我正在研究需要共享指针的跨平台代码。由于我无法控制的原因,我们还不能使用 C++11。所以,我建议使用 boost::shared_ptr。当我们确实采用 C++11(可能一年后)时,我们应该能够用 std 智能指针替换 boost 智能指针。我的问题是关于使用 boost 的最佳方式,以便以后更容易切换。模板别名不可用,因此以下内容不可用:
将 shared_ptr 包装在另一个结构中的另一种技术会导致丑陋且不可读的 API,因为我将不得不因此使用它my::shared_ptr<int>::type
:
我正在寻找替代方案。任何建议将不胜感激。
编辑:我考虑的另一个选择是:
然后使用my::shared_ptr<int>
. 后来我会boost
改成std
in namespace my
。但是,我无法决定每种方法的利弊来做出决定。
c++ - 在模板别名中解包参数包
我遇到了将可变参数模板解压缩为模板别名的问题。
以下代码适用于 Clang 3.4 和 GCC 4.8,但适用于 GCC 4.9:
GCC 4.9 抱怨:
存在一个归档的 GCC 错误(#59498),但这应该失败吗?以下是C++ 核心语言问题 #1430 的一些上下文,“将扩展打包到固定别名模板参数列表中”:
最初,包扩展无法扩展为固定长度的模板参数列表,但在 N2555 中进行了更改。这适用于大多数模板,但会导致别名模板出现问题。
在大多数情况下,别名模板是透明的;当它在模板中使用时,我们可以替换依赖的模板参数。但是,如果模板 ID 对非可变参数使用包扩展,这将不起作用。例如:
没有办法用 来表示
A<Ts...>
,S
所以我们需要坚持A
直到我们有T
s 可以替换,因此需要在 mangling 中处理。目前,EDG 和 Clang 拒绝了这个测试用例,抱怨 A 的模板参数太少。G++ 也是如此,但我认为这是一个错误。然而,在 ABI 名单上,John Spicer 认为它应该被拒绝。
templates - 通过模板别名显式实例化类
是否可以通过模板别名显式实例化模板类?
如果是这样,怎么做?否则,有人可以指出讨论并决定反对的 ISO 文件吗?
这不应该实例化A<double>
,因为B<T>
它只是一个不同的名称A<T>
吗?
c++ - C++:试图在类中封装 std::enable_if
刚刚用 SFINAE 选择函数模板的时候,就有了封装std::enable_if
成这样一个结构体的绝妙想法
然后使用它,例如,像这样
但是,这不起作用,正如人们通过调用所看到的那样
另一方面,通过尝试创建
获得编译器错误(“类型不是 std::enable_if 的成员”)。
这种行为的原因是什么?我问是因为根据我对 SFINAE 的一点了解,我会认为类型推导中的错误会导致排除重载......?
为了完整起见,可以使用模板别名来解决上述问题
是否还有使用结构而不是模板别名的替代方法?
编辑:这里我的意思是解决一般问题的实现。例如,这里
对我不起作用,因为部分专业化需要一个简单的标识符。如果可以,可以用std::is_same
通用结构代替Condition<T,U>
。有什么选择吗?