Questions tagged «templates»

template标记用于多种环境:通用编程(尤其是C ++),以及使用模板引擎生成数据/文档。在实现上有很多疑问时使用此标记-标记实现所使用的代码语言。

6
绑定为空/未定义(带过滤器)时的Angularjs模板默认值
我有一个模板绑定,使用Angular的日期过滤器显示名为“ date”的模型属性,该属性是一个日期。 <span class="gallery-date">{{gallery.date | date:'mediumDate'}}</span> 到目前为止,一切都很好。但是,目前,如果日期字段中没有值,则绑定不显示任何内容。但是,如果没有日期,我希望它显示字符串“ Various”。 我可以使用二进制运算符获取基本逻辑: <span class="gallery-date">{{gallery.date || 'Various'}}</span> 但是我无法使其与日期过滤器一起使用: <span class="gallery-date">{{gallery.date | date:'mediumDate' || "Various"}}</span> 如何在日期过滤器旁边使用二元运算符?

5
如何检查FreeMarker模板中是否存在变量?
我有一个Freemarker模板,其中包含一堆占位符,在处理模板时会为其提供值。如果要提供userName变量,我想有条件地包括模板的一部分,例如: [#if_exists userName] Hi ${userName}, How are you? [/#if_exists] 但是,FreeMarker手册似乎表明if_exists已过时,但是我找不到其他方法来实现这一目标。当然,我可以简单地提供一个额外的布尔变量isUserName,并像这样使用它: [#if isUserName] Hi ${userName}, How are you? [/#if] 但是,如果有一种方法可以检查userName是否存在,那么我可以避免添加此额外变量。

3
为什么我应该避免在函数签名中使用std :: enable_if
Scott Meyers发布了他的下一本书EC ++ 11的内容和状态。他写道,书中的一项可能是“避免std::enable_if使用函数签名”。 std::enable_if 可用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类。 在此问题中,显示了所有三种解决方案。 作为功​​能参数: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; 作为模板参数: template<typename T> struct …


7
std :: function vs template
感谢C ++ 11,我们获得了std::function函子包装器系列。不幸的是,我一直只听到关于这些新功能的坏消息。最受欢迎的是,它们运行缓慢。我测试了一下,与模板相比,它们确实很烂。 #include <iostream> #include <functional> #include <string> #include <chrono> template <typename F> float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; } float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; } int main() { using namespace std::chrono; const auto tp1 = system_clock::now(); for (int i …

14
仅接受某些类型的C ++模板
在Java中,您可以定义仅接受扩展您选择的类的类型的通用类,例如: public class ObservableList<T extends List> { ... } 这是使用“ extends”关键字完成的。 在C ++中,是否有与此关键字等同的简单名称?
158 c++  templates 

7
std :: enable_if有条件地编译成员函数
我试图通过一个简单的示例来了解如何使用std::enable_if。在阅读完此答案后,我想出一个简单的例子应该不难。我想使用std::enable_if两个成员函数之间进行选择,并只允许使用其中之一。 不幸的是,以下代码无法在gcc 4.7中进行编译,经过数小时的尝试,我一直在问你们我的错误是什么。 #include <utility> #include <iostream> template< class T > class Y { public: template < typename = typename std::enable_if< true >::type > T foo() { return 10; } template < typename = typename std::enable_if< false >::type > T foo() { return 10; } }; int main() { Y< …
156 c++  templates  g++  c++11 

3
何时使用std :: forward转发参数?
C ++ 0x显示了使用示例std::forward: template<class T> void foo(T&& arg) { bar(std::forward<T>(arg)); } 何时总是有利于使用std::forward? 另外,它要求&&在参数声明中使用,是否在所有情况下均有效?我以为如果在函数中声明了函数,则必须将临时函数传递给函数&&,因此可以用任何参数调用foo吗? 最后,如果我有这样的函数调用: template<int val, typename... Params> void doSomething(Params... args) { doSomethingElse<val, Params...>(args...); } 我应该用这个代替吗: template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); } 另外,如果在函数中使用两次参数,即同时转发到两个函数,使用它是否明智std::forward?不会std::forward将同一事物转换为临时对象两次,从而移动内存并使之无效以再次使用吗?下列代码可以吗: template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); doSomethingWeird<val, Params...>(std::forward<Params>(args)...); …

3
为什么使用“ b <a?a:b”而不是“ a <b?b:a”以实现最大模板?
C ++模板-《完整指南,第二版》介绍了max模板: template&lt;typename T&gt; T max (T a, T b) { // if b &lt; a then yield a else yield b return b &lt; a ? a : b; } 它解释了使用“b &lt; a ? a : b”代替“a &lt; b ? b : a”: 请注意,根据[StepanovNotes]的max()模板有意返回“ b &lt;a?a:b”而不是“ a &lt;b?b:a”,以确保即使两个值相等但不相等,该函数也能正确运行。 如何理解“ …
154 c++  templates 


4
模板默认参数
如果允许我执行以下操作: template &lt;typename T = int&gt; class Foo{ }; 为什么不允许我主要执行以下操作? Foo me; 但我必须指定以下内容: Foo&lt;int&gt; me; C ++ 11引入了默认模板参数,现在我无法完全理解它们了。
151 c++  templates 

2
void_t如何工作
我观看了Walter Brown在Cppcon14上有关现代模板编程的演讲(第一部分,第二部分),他介绍了他的void_tSFINAE技术。 示例: 给定一个简单的变量模板,该模板评估void所有模板参数是否格式正确: template&lt; class ... &gt; using void_t = void; 以及以下特征来检查是否存在称为member的成员变量: template&lt; class , class = void &gt; struct has_member : std::false_type { }; // specialized as has_member&lt; T , void &gt; or discarded (sfinae) template&lt; class T &gt; struct has_member&lt; T , void_t&lt; decltype( T::member ) &gt; …
148 c++  templates  c++14  sfinae 

3
类模板中的静态成员初始化
我想这样做: template &lt;typename T&gt; struct S { ... static double something_relevant = 1.5; }; 但是我不能,因为something_relevant它不是整数类型。它不依赖T,但是现有的代码取决于它是的静态成员S。 由于S是模板,因此无法将定义放入编译文件中。我该如何解决这个问题?
148 c++  templates  static 

4
如何在类中创建模板函数?(C ++)
我知道可以做一个模板函数: template&lt;typename T&gt; void DoSomeThing(T x){} 并且可以创建一个模板类: template&lt;typename T&gt; class Object { public: int x; }; 但是有可能使一个类不在模板中,然后使该类中的函数成为模板吗?即: //I have no idea if this is right, this is just how I think it would look class Object { public: template&lt;class T&gt; void DoX(){} }; 或某种程度上,类不是模板的一部分,但功能是?
144 c++  templates  function  class 

10
如何使用std :: array模拟C数组初始化“ int arr [] = {e1,e2,e3,…}”行为?
(注意:这个问题是关于不必指定元素的数量,而仍然允许嵌套类型直接初始化。) 这个问题讨论了C数组(如)所剩下的用法int arr[20];。@James Kanze 在回答中显示了C数组的最后据点之一,它具有独特的初始化特性: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; 我们不必指定元素的数量,万岁!现在,使用C ++ 11函数std::begin和std::endfrom &lt;iterator&gt;(或您自己的变体)对其进行迭代,您甚至无需考虑其大小。 现在,是否有任何(可能是TMP)方法可以达到相同目的std::array?允许使用宏使它看起来更好。:) ??? std_array = { "here", "be", "elements" }; 编辑:中级版本,从各种答案编译而成,如下所示: #include &lt;array&gt; #include &lt;utility&gt; template&lt;class T, class... Tail, class Elem = typename …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.