- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经通过 VS2010 运行了以下代码。
#include
template // (a) a base template
void f( T )
{ std::cout << "(a)" << std::endll;}
template // (b) a second base template, overloads (a)
void f( T* ) // (function templates can't be partially
{ std::cout << "(b)" << std::endll;}
template<> // (c) explicit specialization of (b)
void f<>(int*)
{ std::cout << "(c)" << std::endll;}
int main(int argc, char* argv[])
{
int *p = new int(10);
f( p ); // '(c)'
trả về 0;
}
////////////////
#include
template // (a) same old base template as before
void f( T )
{ std::cout << "(a)" << std::endll;}
template<> // (c) explicit specialization, this time of (a)
void f<>(int*)
{ std::cout << "(c)" << std::endll;}
template // (b) a second base template, overloads (a)
void f( T* )
{ std::cout << "(b)" << std::endll;}
int main(int argc, char* argv[])
{
int *p = new int(10);
f( p ); // '(b)'
trả về 0;
}
输出结果为(c)
。但是,如果我把(c)的代码块移到(b)的前面,那么输出结果就是(b)
。我看过相关文章http://www.gotw.ca/publications/mill17.htm这里。仍然感到困惑。
为什么代码的顺序在这个案例中很重要?
câu trả lời hay nhất
我认为您已经掌握了问题中的大部分信息。问题是有两个基本模板是重载的,否则是不相关的。
如果仅在声明第一个模板时执行特化,则编译器将认为这是对 T == int*
的第一个模板的特化。现在,在声明两个模板后,当您执行调用时,编译器将只查看基本模板,并确定第二个模板更适合表达式。第二个模板没有专门化,因此使用基本模板定义。
我要强调的是:模板特化只有在选择了基本模板后才会发挥作用。它们不会影响编译器将选择哪个基本模板。
如果您在声明第二个模板之后移动特化,编译器将使用 T == int
将该特化与第二个基本模板匹配。在这种情况下,当编译器选择第二个模板作为 chủ yếu
中调用的最佳匹配时,特化将启动,您将获得特化行为。
关于c++ - 为什么执行顺序在 "Why Not Specialize Function Templates"中很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990019/
template struct List { }; template class> struct ListHelper; template struct ListHelper> { };
最近,我注意到 html/template.Template 的 Templates() 与 text/template.Template 的工作方式不同。 // go1.12 func main()
我正在尝试使用 polymer 1.0 实现一个网站。我有一个自定义元素 my-greeting,里面有一些模板重复。 我想做的是获取一个名为 TARGET 的字符串,但我不知道该怎么做: /cons
(是的,由于我糟糕的英语,标题很奇怪;我希望有人能改进它。) 接听this question ,我发现这段代码有效: template class A { }; template class U>
这个问题在这里已经有了答案: How to import and use different packages of the same name (2 个答案) 关闭 4 年前。 我正在使用 Go
Suy nghĩ của tôi là điều này là không thể hoặc tôi đang thiếu một bước bổ sung. Dù bằng cách nào, tôi bị mắc kẹt và không thể tìm ra nó. Lý do sử dụng inline templates là để có thể sử dụng cú pháp Laravel Blade kết hợp với sức mạnh của Vue Js. Có vẻ như đó là một trong hai
我已经尝试实现一个“模板模板模板”——模板类来满足我的需求(我对使用模板元编程很陌生)。不幸的是,我发现以下主题为时已晚: Template Template Parameters 不过,我需要实现如
Helm _helpers.tpl? Helm 允许使用 Go templating在 Kubernetes 的资源文件中。 一个名为 _helpers.tpl 的文件通常用于定义 Go 模板助手,语
{{template "base"}} 和 {{template "base".}} 有什么区别? 我用的是go-gin,两者都可以正常运行。我在文档中找不到关于此的任何描述。 最佳答案 来自 god
我有一个本质上充当查找表的函数: function lookup(a::Int64, x::Float64, y::Float64) if a == 1 z = 2*x + y else if a =
当 out 成员函数(来自模板和特化)都需要模板时,为什么 c++ 需要模板参数,因为我没有得到它,谷歌也没有帮助。必须是c++11但和c++1z有同样的错误。 我正在使用 g++ 7.3.0 收到此
我正在寻找简单的方法来将带有 ${myvar} 的简单模板转换为带有 {{ myvar }} 的 GO 模板。 是否有任何库可以实现这一点? 最佳答案 使用正则表达式查找 \${([a-z0-9\_\
我有这个模板可以将 slice 的多个项目解析到页面上。它确实做得很好。 但是,我现在想使用完全相同的模板来根据范围索引解析 slice 的单个值。该 slice 在多个文件中使用,所以我不能像 Sl
要清理模板文件夹,我想将常用模板保存在子文件夹中。目前我有以下文件结构: main.go templates/index.tpl # Main template for the
最近我设计了元类型和允许编译时类型连接的可能操作: #include template typename T> struct MetaTypeTag {}; /*variable template
准备模板时发生错误。谁能告诉你怎么修? 如有必要,还可以编辑变量。 vars: AllСountry: - "name1" - "name2"
我在使用新的匿名模板引擎时遇到问题。它不能使用嵌套模板。我收到错误消息:“此模板引擎不支持嵌套在其模板中的匿名模板”。 我的问题:我如何强制 knockout JS 使用jquery 模板引擎,而不是
Câu hỏi này đã có câu trả lời ở đây: Tôi phải đặt từ khóa "mẫu" và "tên chữ" ở đâu và tại sao (8 câu trả lời) Đóng 8
我在 C++ 中使用带有模板的集合: template class OMSSVDisk : public OMSSObjProperties{ set memberPDs; }; 如上面代码中
因为我喜欢分离接口(interface)和实现,而不是只在头文件中实现模板类,我将它分成 .h 和 .tpp(.tpp 这样它就不会用 *.cpp 编译)。然后我将 tpp 包含在头文件的末尾,就在
Tôi là một lập trình viên xuất sắc, rất giỏi!