在这个问题上 ,有很多关于generics的内容以及他们在幕后做了些什么,所以我们都知道Vector<int[]>是整数数组的向量,而HashTable<String, Person>是一个表的键是string和值Person 。 但是,什么让我难过的是Class<>的用法。 java class Class应该也是一个模板名,(或者我被eclipse中的黄色下划线所告知)。 我不明白我应该放在那里。 Class对象的全部重点是当你没有完全掌握一个对象的信息,reflection等等。 为什么它会让我指定Class对象将保持哪个类? 我显然不知道,或者我不会使用Class对象,我会使用具体的一个。
为什么仅在类模板上允许默认的模板参数? 为什么我们不能在成员函数模板中定义一个默认types? 例如: struct mycclass { template<class T=int> void mymember(T* vec) { // … } }; 相反,C ++强制默认模板参数只能在类模板上使用。
我的意思是,除了它的义务名称(标准模板库)… C ++最初是想将OOP概念提供给C语言。那就是:你可以根据类和类的层次结构来说明一个特定的实体可以做什么(不pipe它是怎么做的)。 由于多重inheritance的问题,一些能力组合更难以描述,而且C ++支持接口的概念有点笨拙(与java等相比),但它在那里(可能是改善)。 然后模板和STL一起发挥作用。 STL似乎采用了传统的OOP概念,并使用模板来代替它们。 应该区分使用模板来概括types的情况,其中types本身与模板的操作无关(例如容器)。 有一个vector<int>是非常有意义的。 然而,在许多其他情况下(迭代器和algorithm),模板化types应该遵循一个“概念”(Input Iterator,Forward Iterator等),其中概念的实际细节完全由模板的实现来定义函数/类,而不是与模板一起使用的类,这是OOP的一些反用法。 例如,你可以告诉这个函数: void MyFunc(ForwardIterator<…> *I); 更新:由于在原来的问题中还不清楚,ForwardIterator可以自行模板化,以允许任何ForwardIteratortypes。 相反,将ForwardIterator作为一个概念。 希望只有通过查看其定义才能获得Forward Iterator,在此您需要查看以下实现或文档: template <typename Type> void MyFunc(Type *I); 我可以赞成使用模板的两个说法:通过为每个使用的types定制编译模板,而不是使用vtables,可以使编译代码更高效。 事实上,模板可以用于本机types。 然而,我正在寻找更为深刻的理由,为什么放弃古典OOP而赞成STL的模板化? (假设你读了那么多:P)
我听说C ++类成员函数模板不能是虚拟的。 这是真的? 如果它们可以是虚拟的,那么可以使用这种function的场景的例子是什么?
任何人都知道如何连接树枝中的string? 我想做一些事情: {{ concat('http://', app.request.host) }}
可能重复: 模板中的关键字'typename'和'class'的C ++差异 在C ++中定义函数模板或类模板时,可以这样写: template <class T> … 或者可以这样写: template <typename T> … 有一个比另一个更好的理由吗? 我接受了最stream行(也是最有意思)的答案,但真正的答案似乎是“不,没有理由相互优先select”。 它们是相同的(除非如下所述)。 有些人有理由总是使用typename 。 有些人有理由一直使用class 。 有些人有理由同时使用。 有些人不在乎他们使用哪一个。 但是,请注意,在模板模板参数的情况下,需要使用class而不是typename 。 请参阅下面的user1428839的答案 。 (但这个特殊情况并不是偏好问题,而是语言的一个要求。)(这也会随着c++17变化而变化)
我知道下面的代码是一个类的部分专业化: template <typename T1, typename T2> class MyClass { … }; // partial specialization: both template parameters have same type template <typename T> class MyClass<T,T> { … }; 另外我知道C ++不允许函数模板局部特化(只允许满)。 但是,我的代码意味着我已经部分专门化我的函数模板为一个/相同types的参数? 因为它适用于Microsoft Visual Studio 2010 Express! 如果不是,那么你能否解释一下部分专业化的概念? #include <iostream> using std::cin; using std::cout; using std::endl; template <typename T1, typename T2> inline T1 max (T1 const& […]
C ++ 0x有模板别名(有时称为模板types定义)。 看到这里 。 C ++的当前规范没有。 你喜欢用什么工作? 容器对象还是macros? 你觉得它值得吗?
我想这样做: template <typename T> struct S { … static double something_relevant = 1.5; }; 但是我不能,因为something_relevant不是整型。 它不依赖于T ,但是现有的代码依赖于它是S一个静态成员。 由于S是模板,我不能把定义放在编译的文件里面。 我如何解决这个问题?
我被告知C ++中的模板系统在编译时是Turing-complete的。 这在这篇文章中也提到了维基百科 。 你能提供一个利用这个属性的计算的一个不平凡的例子吗? 这在事实上是有用的吗?